Подтвердить что ты не робот

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

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

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

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

Update:
Решенная вторая проблема - это просто копирование по реализации JavaScript и внесение нескольких настроек, поэтому для этого не нужно решение.

4b9b3361

Ответ 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, поэтому он синхронизирован с приведенной выше осторожностью.

Внимание!

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

Ответ 2

Используйте CustomValidationAttribute вместе с функцией проверки подлинности с подписью

public static ValidationResult Validate(MyType x, ValidationContext context)

Пример (для свойства string)

using System.ComponentModel.DataAnnotations;

public class MyClass
{
    [CustomValidation(typeof(MyClass), "Validate")]
    public string MyProperty { get; set; }

    public static ValidationResult Validate(string x, ValidationContext context)
    {
        return (x == "valid")
            ? new ValidationResult(null)
            : ValidationResult.Success;
    }
}