【问题标题】:Validating dynamically created fields in ASP.NET MVC验证 ASP.NET MVC 中动态创建的字段
【发布时间】:2009-02-20 05:36:31
【问题描述】:

我在 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 不包含任何键。我在哪里错了?有什么线索吗?

【问题讨论】:

    标签: asp.net asp.net-mvc


    【解决方案1】:

    想通了。 ViewData.ModelState 由响应对象中的参数填充。因此,对于动态创建的表单,您不知道帖子中传递的确切内容。所以我只是动态地重新创建我的 ModelState:

    fields.ForEach(f => ViewData.ModelState.Add(f.FieldName ...
    

    然后我们都很好......当在视图上运行验证时,它可以找到 ModelState 中的所有键,没有例外......就像一个魅力。

    【讨论】:

      【解决方案2】:
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多