3

好的,我快到这里了。我有一个带有视图模型的简单 MVC3 应用程序

视图模型

    public class TicketViewModel {
    public Ticket Ticket { get; set; }

    [DisplayName("Name")]
    [Required(ErrorMessage = "Requestor's name is required.")]
    public string Name { get; set; } }

控制器

    [HttpPost]
    public ActionResult Create(TicketViewModel vm)
    {
        if(ModelState.IsValid) {

            TempData["message"] = "Your ticket has been submitted.";
            TempData["message-class"] = "success";

            return RedirectToAction("Index");
        }

        TempData["message-class"] = "error";

        return View("Index", vm);
    }

出于某种原因,ModelState.IsValid 一直都是真实的。即使名称留空。就像模型/视图模型根本没有验证一样。这适用于其他应用程序,所以我很确定我没有连接一些东西。我也包含了所有的验证 javascript,尽管我认为这不是问题所在。

更新 有趣的是,@Html.TextBoxFor() 生成的 html 标签不包括 data-val 和 data-val-required 属性。

看法

@model MyApp.ViewModels.TicketViewModel

@{
    ViewBag.Title = "Tickets";
}

<div id="main-content">
    <section class="large">
      <div class="section">
        <div class="section-header">Submit Ticket</div>
        <div class="section-content">
          <div class="message"></div>

          @using( Html.BeginForm("Create", "Home", FormMethod.Post) ) {
            <h2>User Information</h2>
            <dl>
              <dt>@Html.LabelFor( m => m.Name)</dt>
              <dd>
                @Html.TextBoxFor( m => m.Name)
                @Html.ValidationMessageFor( m => m.Name)
              </dd>

              <dt></dt>
              <dd><button>Submit</button></dd>
            </dl>
          }
        </div>
      </div>
    </section>
</div>

更新二

那么现在这很有趣。我创建了一个新应用程序并使用基本代码进行工作。然后,当我将 DI 代码添加到 global.asax.cs 时,验证停止工作。具体来说,当我添加

    public void SetupDependencyInjection() {
        _kernel = new StandardKernel();
        RegisterServices(_kernel);
        DependencyResolver.SetResolver(new NinjectDependencyResolver(_kernel));
    }

并从 Application_Start() 调用它

    protected void Application_Start()
    {
        SetupDependencyInjection();

        AreaRegistration.RegisterAllAreas();

        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);
    }

如果我删除 SetupDependencyInjection() 验证开始工作。需要明确的是,DI 运作良好,但它似乎扼杀了验证。这在 MVC3 工具更新之前运行良好。

4

4 回答 4

3

我能够找到解决方案。似乎当您通过 nuget 安装 Ninject 时,配置有点不同。它从 App_Start 文件夹配置您的应用程序。基本上,我在从 global.asax 调用我的 Ninject-Fu 时加倍努力。这最终导致了奇怪的验证问题,尽管应用程序的其他部分正在工作。

Ninject - 设置 MVC3 应用程序

于 2011-05-19T23:00:50.163 回答
1

您是否使用了默认模型绑定器(使用 DI)以外的其他东西?我很确定默认模型绑定器将在绑定时验证对象。如果您不使用默认设置,您可能不会遇到相同的行为。

于 2011-05-19T21:37:50.813 回答
0

将 Ninject.Mvc 和 DependencyResolver 一起使用时,我遇到了同样的错误。原因是我为每个 Bootstrapper 和 DependencyResolver 对象创建了一个新的 IKernel 实例。

//Application_Start()
DependencyResolver.SetResolver(new NinjectDependencyResolver(NinjectBooster.CreateKernel()));

为了解决这个问题,我将代码更改为使用相同的缓存实例,如下所示:

//Application_Start()
DependencyResolver.SetResolver(new NinjectDependencyResolver(NinjectBooster.GetKernel()));
...

//NinjectMVC.cs
private static IKernel _kernel;

/// <summary>
/// Creates the kernel that will manage your application.
/// </summary>
/// <returns>The created kernel.</returns>
public static IKernel GetKernel()
{
   if (null == _kernel)
   {
       _kernel = new StandardKernel();
       RegisterServices(_kernel);
   }
        return _kernel;
}
于 2011-09-12T09:14:33.790 回答
0

尝试使用

@Html.EditorFor(model => model.Name)

那应该data-正确应用属性

于 2011-05-19T20:54:56.473 回答