1

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

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

任何帮助/指导将不胜感激。

[为过长的帖子道歉]

4

1 回答 1

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);
           }
       }
    }
}
于 2011-06-27T17:33:33.703 回答