Ответ 1
Чтобы создать собственный валидатор аннотации данных, выполните следующие действия:
- Ваш класс должен наследовать от класса
System.ComponentModel.DataAnnotations.ValidationAttribute
. - Переопределить метод
bool IsValid(object value)
и внедрить в него логику проверки.
Что это.
ВАЖНО Внимание
Иногда разработчики проверяют, что значение не равно null/empty и возвращает false. Обычно это неправильное поведение, поскольку проверка на Required
проверяет, что означает, что ваши пользовательские валидаторы должны проверять только ненулевые данные, но возвращать true
в противном случае (см. Пример). Это сделает их пригодными для использования в обязательных (обязательных) и необязательных полях.
Пример
public class StringLengthRangeAttribute : ValidationAttribute
{
public int Minimum { get; set; }
public int Maximum { get; set; }
public StringLengthRangeAttribute()
{
this.Minimum = 0;
this.Maximum = int.MaxValue;
}
public override bool IsValid(object value)
{
string strValue = value as string;
if (!string.IsNullOrEmpty(strValue))
{
int len = strValue.Length;
return len >= this.Minimum && len <= this.Maximum;
}
return true;
}
}
Все свойства могут быть установлены в атрибуте, как вы хотите их установить.
Некоторые примеры:
[Required]
[StringLengthRange(Minimum = 10, ErrorMessage = "Must be >10 characters.")]
[StringLengthRange(Maximum = 20)]
[Required]
[StringLengthRange(Minimum = 10, Maximum = 20)]
Если определенное свойство не задано, его значение устанавливается в конструкторе, поэтому оно всегда имеет значение. В приведенных выше примерах использования я намеренно добавил валидатор Required
, поэтому он синхронизирован с приведенной выше осторожностью.
Внимание!
Таким образом, этот валидатор будет по-прежнему работать с вашим значением модели, которое не требуется, но когда оно присутствует, оно проверяет (подумайте о текстовом поле в веб-форме, которое не требуется, но если пользователь вводит значение, он должен допустим).