我有一个简单的问题数据模型:
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”和其他各种组合。
非常感谢任何帮助/指导。
[为过长的帖子道歉]
答案 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);
}
}
}
}