我有一个如下所示的列表框:
@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; }
答案 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
属性将调用默认构造函数,这将创建一个空列表。
相关问题: