Желая создать пользовательскую проверку аннотации данных. Есть ли какие-нибудь полезные руководства / примеры по их созданию?
Во-первых:
StringLength с минимальной и максимальной длиной. Я знаю, что .NET 4 может это сделать, но хочу сделать то же самое в .NET 3.5, если возможно, имея возможность определять только минимальную длину (не менее x символов), только максимальную длину (до x символов) или и то, и другое. (между символами x и y).
Во-вторых:
Проверка с использованием модульной арифметики - если число является допустимой длиной, я хочу проверить с помощью алгоритма Modulus 11 (я уже реализовал его в JavaScript, поэтому я думаю, что это просто быть простым портированием?)
Обновление:
Вторая проблема решена, это всего лишь случай копирования реализации JavaScript и внесения некоторых изменений, поэтому для этого не нужно решение.
Чтобы создать пользовательский валидатор аннотаций данных, следуйте этим указаниям:
System.ComponentModel.DataAnnotations.ValidationAttribute
. bool IsValid (значение объекта)
и реализовать внутри него логику проверки. Вот и все.
Иногда разработчики проверяют, не является ли значение нулевым / пустым, и возвращают false. Это обычно неправильное поведение, потому что это на Требуется
валидатор для проверки, что означает, что ваши пользовательские валидаторы должны проверять только ненулевые данные, но возвращать 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
, так что он синхронизирован с указанным выше предупреждением .
Таким образом, этот валидатор по-прежнему будет работать со значением вашей модели, которое не требуется, но когда оно присутствует, оно проверяет (подумайте о текстовом поле в веб-форме, это не обязательно, но если пользователь вводит значение в , он должен быть действительным).