我的问题的一些背景:
我正在 ASP.Net MVC 4 中构建一个向导样式的界面,一次填充一页对象的属性。我使用 DataAnnotation 属性来指定我的业务规则并定义一个有效的填充对象的外观。
由此产生的一个并发症是验证。由于需要几个步骤才能完全填写对象并使其有效,因此我必须手动验证每个步骤设置的每个字段。
这最终在我的控制器类中看起来像这样:
[HttpPost]
public ActionResult Step1(MyBigModel m)
{
if (ViewData.ModelState["Field1"].Errors.Count() == 0
&& ViewData.ModelState["Field2"].Errors.Count() == 0)
{
repository.saveStep1(m);
return RedirectToAction("Step2", new { myId= m.myId});
}
else
return View(m);
}
}
这种方法的烦恼是我要检查的字段并不总是在 ModelState 字典中!如果存在验证错误,该字段将在字典中。但是,如果它是有效的,它可能在也可能不在字典中。
似乎某些输入类型比其他输入类型效果更好——文本框似乎相当一致,而复选框从未出现。我无法找出一致的规则集来预测它们何时会在那里,也没有找到任何相关文档。
所以,我的问题是,什么决定了一个字段是否会出现在 ViewData.ModelState 字典中?