1

我正在将我当前的 asp.net 站点迁移到 mvc 3。旧的 asp.net 页面实现了转发器控制,并且可以验证后面代码中的每一行。

我创建了一个模型类并继承了 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]"))

我的问题是如何根据上述代码的说明性注释来识别哪一行出错。

任何人?请指教。先感谢您

4

1 回答 1

0

由于缺乏支持,验证数组和集合在 MVC 中是一件棘手的事情。

在验证 IEnumerable、ICollection、IList 等中的单个元素时,您必须在 HTML 元素中包含每个元素的索引,并在 ModelState 中包含验证索引(至少作为最常见的解决方法,而无需创建自定义模型粘合剂)。

因此,如果您的模型如下所示:

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]")

现在就实际查找 WHICH 元素具有验证消息而言,您需要查看 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

重要的是要记住,列表中每个元素的每个属性都有自己的条目。

于 2012-06-14T20:54:11.677 回答