如果未选择任何项目,则ListBoxFor不显示ValidationMessageFor

时间:2019-01-21 16:53:18

标签: asp.net-mvc-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 个答案:

答案 0 :(得分:0)

如果您在reference source中选中RequiredAttribute,将会看到类似这样的覆盖IsValid方法:

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

    // other stuff

    return true;
}

这里的问题是IsValid方法仅检查空值和空对象,而不检查集合对象中存在的Count属性,例如IEnumerable<T>。如果要检查零值Count属性(表示没有选中的项目),则需要创建从RequiredAttribute继承并包含IEnumerator.MoveNext()检查的自定义注释属性,并将其应用于{{ 1}}属性:

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; },因为当未选择任何项目时,数组属性将返回RequiredAttribute,而null属性将调用默认构造函数,这将创建一个空列表。

相关问题:

Required Attribute on Generic List Property