我的问题的一些背景:
我正在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字典中?
答案 0 :(得分:2)
ModelStateDictionary的MSDN文章
表示尝试将已发布的表单绑定到操作方法的状态,其中包含验证信息。
因此,ViewData.ModelState
字典包含对服务器的请求中包含的值。这不一定是绑定模型上的所有属性。如果此词典中缺少您需要的内容,请将其作为隐藏字段包含在视图中,以便将其发布到服务器。