好的,我几乎无能为力了。我有一个带有 View 模型的简单 MVC3 应用程序
View 模型
public class TicketViewModel {
public Ticket Ticket { get; set; }
[DisplayName("Name")]
[Required(ErrorMessage = "Requestor's name is required.")]
public string Name { get; set; } }
Controller
[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 始终显示为 true。即使名称留空。就像模型/ View 模型根本没有验证一样。这适用于其他应用程序,所以我很确定我没有连接任何东西。我也包含了所有验证 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 工具更新之前运行良好。
最佳答案
我找到了解决方案。似乎当您通过 nuget 安装 Ninject 时配置有点不同。它从 App_Start 文件夹配置您的应用程序。基本上我在从 global.asax 调用我的 Ninject-Fu 时加倍了。这最终导致了奇怪的验证问题,尽管应用程序的其他部分正在运行。
关于validation - Model.IsValid 总是返回 true,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6063893/