【发布时间】:2011-05-19 19:30:01
【问题描述】:
好的,我快到这里了。我有一个带有视图模型的简单 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 一直都是true。即使名称留空。就像模型/视图模型根本没有验证一样。这适用于其他应用程序,所以我很确定我没有连接一些东西。我已经包含了所有的验证 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>
更新 II
现在这很有趣。我创建了一个新应用程序并使用基本代码进行工作。然后,当我将 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 工具更新之前运行良好。
【问题讨论】:
-
一切看起来都很好。问题应该出在其他地方。你确定
Create动作被击中并且vm.Name内部为空或空,尽管ModelState.IsValid = true?还有vm != null?因为如果它是 null 模型状态将是有效的。 -
当你使用
ModelState.IsValid时,你肯定必须使用TryValidateModel(vm); -
我设置了一个断点,可以看到我在创建操作中。 vm 不为空,但其中的所有属性都为空。这应该会导致 IsValid 为假。
-
BuildStarted:我很确定 ModelState.IsValid 会运行验证。反正应该是。刚刚检查过这也返回 True
-
@jdiaz
ModelState.IsValid不执行任何验证。它只是检查是否注册了任何模型错误。
标签: validation asp.net-mvc-3 ninject-2