验证MVC数据集合

时间:2011-06-27 08:51:21

标签: asp.net-mvc validation data-collection

我有一个简单的问题数据模型:

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

My Controller构建视图模型(来自数据源)并呈现视图:

@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()方法时,我当前正在使用格式为“Questions [0]”的键值,但我还尝试了“Questions_0”和其他各种组合。

非常感谢任何帮助/指导。

[为过长的帖子道歉]

1 个答案:

答案 0 :(得分:0)

我找到了答案 - 就像许多事情一样,一旦我解决了问题就很明显 - 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);
           }
       }
    }
}