2012-05-22 42 views
1

我正在將我當前的asp.net網站遷移到mvc 3.舊的asp.net頁面實現中繼器控制,並且可以驗證代碼背後的每一行。如何在實現IValidatableobject的類中驗證ILIST類屬性中的行?

我創建了一個Model類並繼承了IValidatableObject。請參見下面的代碼:

public class ManageInstitutions : IValidatableObject 
{ 
     public ManageInstitutions() { } 

     public int InstitutionID { get; set; } 
     public string InstituteName { get; set; } 
     public string FName { get; set; } 
     public string LName { get; set; } 
     public string EAddress { get; set; } 

     public IList<InstitutionIPBL> IPDetailsList { get; set; } 

     //Validation Function 
     public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
     { 
      foreach (var item in IPDetailsList) 
      { 
       if (item.IPPart1.Length == 0 && item.IPPart2.Length == 0 && item.IPPart3From.Length == 0 && item.IPPart3To.Length == 0 && item.IPPart4From.Length == 0 && item.IPPart4To.Length == 0) 
        { 
         //How to return ValidationResult that will identify which row got an error????????? 
        } 
      } 
     } 


} 

InstitutionIPBL是從舊asp.net業務層傳來的一類。我重新使用這個類來表示我的模型中的屬性。

我需要知道如何識別哪一行出錯。我正在使用此語法來檢查該字段是否有效:Html.ViewData.ModelState.IsValidField("[Field Name]"))

我的問題是如何確定哪一行出現錯誤,如上面的代碼所示。

有人嗎?請指教。提前致謝

回答

0

由於缺乏支持,驗證數組和集合在MVC中是一件棘手的事情。

當涉及驗證IEnumerable,ICollection,IList等內的單個元素時,您必須在ModelState中包含HTML元素和驗證索引內的每個元素的索引(至少作爲最常用的解決方法,創建自定義模型活頁夾)。

所以,如果你的模型是這樣的:

public IList<string> List { get; set; } 

而且您的標記看起來像這樣:

<input type="text" name="List[0]" /> 
<input type="text" name="List[1]" /> 
<input type="text" name="List[2]" /> 

然後你會發現,每一個元素都有自己的指數,這就是MVC的形式提供使用將輸入綁定到模型。

因此,當你去寫你的驗證,你需要確保包括違規元素的索引(代碼爲簡單起見,擴大):

public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
{ 
     for (int i = 0; i < List.Count; i++) { 
      if (string.IsNullOrEmpty(List[i])) { 
       yield return new ValidationResult(i + 
            ": You forgot to fill in the box.", 
            new[] { "List[" + i + "]" }); 
      } 
     } 
} 

然後,當你去寫你的驗證消息:

@Html.ValidationMessage("List[1]") 

現在就實際查找哪個元素具有驗證消息,你需要翻閱ModelState中得到無效的元素的關鍵。

ModelState.Where(x => x.Key.StartsWith("List") && x.Value.Errors.Count > 0) 
      .Select(x => x.Key); 

像這樣的東西可以製作成的HtmlHelper其中的ModelState可以通過訪問:

public static IEnumerable<string> 
     GetValidationMessagesForGroup(this HtmlHelper helper, string keyStart) { 
    return helper.ViewData.ModelState.Where(x => x.Key.StartsWith("List") 
         && x.Value.Errors.Count > 0).Select(x => x.Key); 
} 

,並調用它在您的觀點:

@{ 
    foreach(string key in Html.GetValidationMessagesForGroup("List")) 
     @Html.ValidationMessageFor(key) 
} 

對於強類型的對象,你只需要添加屬性即可。

Child[0].FirstName 

請務必記住,列表中每個元素的每個屬性都有自己的條目。

相關問題