Проверка коллекций данных MVC - PullRequest
1 голос
/ 27 июня 2011

У меня есть простая модель данных Вопроса:

public class Question {
    int QuestionId { get; set; }
    string Text { get; set; }
    string Answer { get; set; }
    string ValidationMessage { get; set; }
};

Используя этот класс, я построил представление Модель:

public class QuestionViewModel {
    string Introduction { get; set; }
    IEnumerable<Question> Questions { get; set; }
};

Мой контроллер строит модель представления (из данныхsource) и отображает представление:

@model QuestionViewModel

@using (Html.BeginForm()) {
    if (Model.Questions != null) {
        <ol>
            @Html.EditorFor(m => Model.Questions)
        </ol>
    }
    @Html.ValidationSummary("Unable to process answers...")

    <input type="submit" value="submit" />
}

В этом представлении используется шаблон EditorTemplate:

@model Question

<li>
    @Html.HiddenFor(m => m.Questionid)
    @Html.TextBoxFor(m => m.Answer)
    @Html.ValidationMessageFor(m => m.Answer)
</li>

На данный момент, когда страница отправляется обратно, контроллер проверяет ответ:

[HttpPost]
public ActionResult Response(QuestionViewModel model) {
    if (ModelState.IsValid) {
       for (int i = 0; i < model.Questions.Count(); i++) {
           Question q = model.Questions[i];
           string questionId = String.Format("Questions[{0}]", i);

           if (String.IsNullOrWhiteSpace(q.Answer)) {
               ModelState.AddModelError(questionId, q.ValidationMessage);
           }
       }
    }
}

Проблема, с которой я столкнулся, заключается в том, что большая часть этого работает нормально - проверки и сводка проверки показывают правильные сообщения проверки.Проблема в том, что я не могу заставить отдельные валидаторы полей отображать ошибку:

<span class="field-validation-valid" data-valmsg-replace="true" data-valmsg-for="Questions[0].StringValue"></span>

Как вы можете видеть, когда я вызываю метод ModelState.AddModelError (), я в настоящее время использую значение ключаФормат «Вопросы [0]», но я также попробовал «Вопросы_0» и другие различные комбинации.

Любая помощь / руководство будет высоко ценится.

[Извинения за слишком длинный пост]

1 Ответ

0 голосов
/ 27 июня 2011

Я нашел ответ - как и во многих других случаях, это было очевидно, когда я решил проблему - ModelState.AddModelError () просто потребовался полностью определенный ключ!

Измените контроллер HttpPost следующим образом:

[HttpPost]
public ActionResult Response(QuestionViewModel model) {
    if (ModelState.IsValid) {
       for (int i = 0; i < model.Questions.Count(); i++) {
           Question q = model.Questions[i];

           /*
           ** The key must specify a fully qualified element name including
           ** the name of the property value, e.g.
           ** "Questions[0].Answer"
           */
           string questionId = String.Format("Questions[{0}].Answer", i);

           if (String.IsNullOrWhiteSpace(q.Answer)) {
               ModelState.AddModelError(questionId, q.ValidationMessage);
           }
       }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...