2011-06-27 135 views
1

我有一個簡單的問題的數據模型:驗證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]「,但我也嘗試過」Questions_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); 
      } 
     } 
    } 
}