Как создать пользовательские валидаторы аннотаций данных - PullRequest
40 голосов
/ 05 августа 2010

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

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

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

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

Ответы [ 2 ]

87 голосов
/ 05 августа 2010

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

  1. Ваш класс должен наследовать от System.ComponentModel.DataAnnotations.ValidationAttribute class.
  2. Переопределить bool IsValid(object value) метод и реализовать логику проверки внутриit.

Вот и все.

ВАЖНО Внимание

Иногда разработчики проверяют, что значение не равно нулю / пусто, и возвращают 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, так что он синхронизируется с приведенным выше предостережением , которое я написал.

Важно

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

4 голосов
/ 13 июля 2017

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

public static ValidationResult Validate(MyType x, ValidationContext context)

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

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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...