c# - 什么决定一个字段是否在 ViewData.ModelState 字典中?

标签 c# asp.net-mvc validation data-annotations

我的问题的一些背景:

我正在 ASP.Net MVC 4 中构建一个向导式界面,一次一页地填充一个对象的属性。我使用 DataAnnotation 属性来指定我的业务规则,并定义一个有效的、已填写的对象是什么样的。

由此产生的一个复杂问题是验证。由于需要几个步骤才能完全填写对象并使其有效,因此我必须手动验证每个步骤设置的每个字段。

这在我的 Controller 类中看起来像这样:

[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 字典中?

最佳答案

ModelStateDictionary 的 MSDN 文章说

Represents the state of an attempt to bind a posted form to an action method, which includes validation information.

因此,ViewData.ModelState 字典包含对服务器的请求中包含的值。这不一定是绑定(bind)模型上的所有属性。如果此词典中缺少您需要的内容,请将其作为隐藏字段包含在您的 View 中,以便将其发布到服务器。

关于c# - 什么决定一个字段是否在 ViewData.ModelState 字典中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15954758/

相关文章:

c# - 任务取消

asp.net - 从模型状态验证中删除对象

javascript - 如何在javascript中显示警告框和innerHTML

javascript - 客户端 JavaScript/jQuery 表单验证没有用吗?

c# - javascript从一个cshtml页面验证值来检查其他cshtml页面?

c# - 如何 Type T = Type.GetType ("SomeClass");给我一个物体?

asp.net-mvc - IIS 8.x 虚拟目录上的 Angular 应用程序具有奇怪的 URL 行为

html.BeginForm MVC 5 导致表单标签 CSS 问题

java - 如何将嵌套循环插入到2个while循环中

javascript - 使用 SignalR 时 Chart.js addData 未定义