Если вы отметите 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()
и применить его к 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
, когда элементы не выбраны, а свойства List<T>
вызывают конструктор по умолчанию, который создаст пустой список.
Связанная проблема:
Обязательный атрибут в универсальном свойстве списка