2009-02-20 15 views
1

У меня есть следующий вид с точки зрения ASP.NET MVC:Проверка динамически создаваемых полей в 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 не содержит каких-либо клавиш. Где я здесь не так? Любые подсказки?

ответ

3

Выяснил это. ViewData.ModelState заполняется параметрами объекта ответа. Таким образом, с динамически созданной формой вы точно не знаете, что было передано в сообщении. Так что я просто воссоздать мой ModelState на лету:

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

И тогда мы все хорошо ... когда проверка выполняется на взгляд он может найти все ключи в ModelState и без каких-либо исключений ... работает как шарм.