2012-05-22 19 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 

请务必记住,列表中每个元素的每个属性都有自己的条目。

相关问题