Проверка коллекций данных MVC

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

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; }
};

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

@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» и различные другие комбинации.

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

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


person Neilski    schedule 27.06.2011    source источник


Ответы (1)


Я нашел ответ - как и во многих других случаях, это было очевидно, когда я разобрался с проблемой - для 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);
           }
       }
    }
}
person Neilski    schedule 27.06.2011