Как создать валидаторы пользовательских аннотаций данных

Желая создать пользовательскую проверку аннотации данных. Есть ли какие-нибудь полезные руководства / примеры по их созданию?

Во-первых:
StringLength с минимальной и максимальной длиной. Я знаю, что .NET 4 может это сделать, но хочу сделать то же самое в .NET 3.5, если возможно, имея возможность определять только минимальную длину (не менее x символов), только максимальную длину (до x символов) или и то, и другое. (между символами x и y).

Во-вторых:
Проверка с использованием модульной арифметики - если число является допустимой длиной, я хочу проверить с помощью алгоритма Modulus 11 (я уже реализовал его в JavaScript, поэтому я думаю, что это просто быть простым портированием?)

Обновление:
Вторая проблема решена, это всего лишь случай копирования реализации JavaScript и внесения некоторых изменений, поэтому для этого не нужно решение.

42
задан Rap 16 August 2012 в 18:26
поделиться

1 ответ

Чтобы создать пользовательский валидатор аннотаций данных, следуйте этим указаниям:

  1. Ваш класс должен быть унаследован от класса System.ComponentModel.DataAnnotations.ValidationAttribute .
  2. Переопределить метод 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 , так что он синхронизирован с указанным выше предупреждением .

Важно

Таким образом, этот валидатор по-прежнему будет работать со значением вашей модели, которое не требуется, но когда оно присутствует, оно проверяет (подумайте о текстовом поле в веб-форме, это не обязательно, но если пользователь вводит значение в , он должен быть действительным).

88
ответ дан 26 November 2019 в 23:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: