Thêm thuộc tính Required
vào thuộc tính kiểu danh sách không thực sự làm những gì bạn muốn. Sẽ khiếu nại nếu danh sách không được tạo ra, nhưng sẽ không phàn nàn nếu danh sách tồn tại với 0 mục trong đó.
Tuy nhiên, nó phải là đủ dễ dàng để lấy được thuộc tính chú thích dữ liệu của bạn và làm cho nó kiểm tra danh sách cho Count
> 0. Một cái gì đó như thế này (không được thử nghiệm chưa):
[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);
}
}
EDIT:
Bạn cũng sẽ phải cẩn thận cách bạn ràng buộc danh sách trong chế độ xem của mình. Ví dụ, nếu bạn liên kết một List<String>
đến một cái nhìn như thế này:
<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" />
Các mô hình MVC binder sẽ luôn đặt 5 yếu tố trong danh sách của bạn, tất cả String.Empty
. Nếu đây là cách Chế độ xem của bạn hoạt động, thuộc tính của bạn sẽ cần phức tạp hơn một chút, chẳng hạn như sử dụng Reflection để lấy thông số loại chung và so sánh từng phần tử danh sách với default(T)
hoặc thứ gì đó.
Một lựa chọn tốt hơn là sử dụng jQuery để tạo các yếu tố đầu vào động.
Nguồn
2011-06-21 17:01:39
Nếu bạn thay đổi mô hình của bạn để sử dụng một mảng thay vì một danh sách, bạn có thể sử dụng [MinLengthAttribute ] (https://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.minlengthattribute%28v=vs.110%29.aspx) – janv8000