好的,我快到这里了。我有一个带有视图模型的简单 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 工具更新之前运行良好。