解决方法
将“必需”属性添加到列表样式属性不会真正做到您想要的。如果列表未创建,则将抱怨,但如果列表中存在0项,则不会抱怨。
但是,应该很容易得出自己的数据注释属性,并使其检查Count>的列表。这样的东西(尚未测试):
[AttributeUsage(AttributeTargets.Property)] public sealed class CannotBeEmptyAttribute : ValidationAttribute { private const string defaultError = "'{0}' must have at least one element."; public CannotBeEmptyAttribute ( ) : base(defaultError) // { } public override bool IsValid ( object value ) { IList list = value as IList; return ( list != null && list.Count > 0 ); } public override string FormatErrorMessage ( string name ) { return String.Format(this.ErrorMessageString,name); } }
编辑:
您还必须小心如何在视图中绑定列表。例如,如果绑定List< String>像这样的看法:
<input name="ListName[0]" type="text" /> <input name="ListName[1]" type="text" /> <input name="ListName[2]" type="text" /> <input name="ListName[3]" type="text" /> <input name="ListName[4]" type="text" />
MVC模型binder将始终将5个元素放在列表中,即所有的String.Empty。如果这是您的View如何工作,您的属性将需要更复杂,例如使用Reflection来拉取通用类型参数并将每个列表元素与默认(T)或某些东西进行比较。
一个更好的选择是使用jQuery动态创建输入元素。