代码之家  ›  专栏  ›  技术社区  ›  Nate Pet

如果未选择任何项,则不显示validationmessagefor的列表框

  •  0
  • Nate Pet  · 技术社区  · 5 年前

    我有如下列表框:

     @Html.Label("Members", htmlAttributes: new { @class = "control-label required", @multiple = "multiple" })
     @Html.ListBoxFor(model => model.Members, (IEnumerable<SelectListItem>)ViewBag.Members, new { @class = "form-control", @multiple = "multiple" })                                               
     @Html.ValidationMessageFor(model => model.Members, "", new { @class = "text-danger" })
    

    我遇到的问题是,即使没有选择任何成员,它也不会显示验证消息。

        [Required(ErrorMessage = "Please select a member")]
        public List<int> Members { get; set; }
    
    1 回复  |  直到 5 年前
        1
  •  0
  •   Tetsuya Yamamoto    5 年前

    如果你检查 RequiredAttribute 在里面 reference source ,您将看到overriden IsValid 方法如下:

    public override bool IsValid(object value) 
    {
        // checks if the object has null value
        if (value == null) 
        {
            return false;
        }
    
        // other stuff
    
        return true;
    }
    

    这里的问题是 有效的 方法只检查空值和空对象,但不检查 Count 集合对象中存在的属性,例如 IEnumerable<T> . 如果你想核对零值 伯爵 属性(表示没有选定项),需要创建继承自的自定义批注属性 必需的属性 包含 IEnumerator.MoveNext() 检查并应用于 List<T> 财产:

    [AttributeUsage(AttributeTargets.Property)]
    public sealed class RequiredListAttribute : RequiredAttribute
    {
        public override bool IsValid(object value)
        {
            var list = value as IEnumerable;
    
            // check against both null and available items inside the list
            return list != null && list.GetEnumerator().MoveNext();
        }
    }
    
    // Viewmodel implementation
    public class ViewModel
    {
        [RequiredList(ErrorMessage = "Please select a member")]
        public List<int> Members { get; set; }
    }
    

    注:

    使用 int[] 数组类型而不是 List<int> 例如 public int[] Members { get; set; } 应该符合标准 必需的属性 因为数组属性返回 null 当没有选择任何项时,而 列表& T; 属性调用将创建空列表的默认构造函数。

    相关问题:

    Required Attribute on Generic List Property