我在ASP.NET MVC视图中有以下表单:
<%= Html.ValidationSummary() %>
<% var fields = ViewData.Model; %>
<% using (Html.BeginForm("Dynamic", "Candidate")) { %>
<% foreach (var field in fields) { %>
<label for="<%= field.FieldName %>"><%= field.FieldName %></label>
<%= Html.TextBox(field.FieldName, field.Value, new { @class = "short" }) %>
<% } %>
<a class="button green" onclick="$('form').submit(); return false;">Submit</a>
<% } %>
我有一个控制器操作,可以加载此表单并接受帖子,它看起来像这样:
public ActionResult Dynamic() {
var fields = DataProvider.Candidates.GetAllDynamicFields();
if (Request.HttpMethod == "POST") {
fields.ForEach(f => f.Value = Request[f.FieldName]);
var validation = DataProvider.Candidates.SaveDynamicFields(fields);
if (validation.IsValid)
return RedirectToAction("Index");
ViewData.ModelState.AddErrorsFromValidationResult(validation);
}
return View(fields);
}
我的问题是,如果任何验证器失败(即验证对象包含错误),那么我在视图渲染时会收到错误,因为ViewData.ModelState不包含任何键。我在哪里错了?有线索吗?
答案 0 :(得分:3)
想出来。 ViewData.ModelState由响应对象中的参数填充。因此,使用动态创建的表单,您无法准确知道帖子中传递的内容。所以我只是动态地重新创建我的ModelState:
fields.ForEach(f => ViewData.ModelState.Add(f.FieldName ...
然后我们都很好......当在视图上运行验证时,它可以找到ModelState中的所有键,没有例外......就像魅力一样。
答案 1 :(得分:1)