Проверка динамически создаваемых полей в ASP.NET MVC - PullRequest
1 голос
/ 20 февраля 2009

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

Ответы [ 2 ]

3 голосов
/ 20 февраля 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...