Перегрузка ValidationAttribute предотвращает некоторое желаемое поведение по умолчанию - PullRequest
0 голосов
/ 09 января 2020

Я создал собственный валидатор StringLength, потому что мы не хотим, чтобы всплывающие сообщения об ошибках нигде на нашем сайте, а простая их перегрузка дает нам разбираемую ошибку уровня модели, которая автоматически не помещается в пузырь.

Так вот в чем проблема: валидатор StringLength по умолчанию создает атрибуты для элементов html, потому что у нас есть jquery ненавязчивая проверка. Атрибут в вопросе data-val-length-max. Моя перегруженная версия НЕ создает это, и тег необходим, потому что мы используем его для счетчика текста, который работает в javascript. Вот мой валидатор:

public class DCStringLength : StringLengthAttribute
{
    private int? _minLength; private int? _maxLength;

    /// <summary>
    /// Gives string length validation.  zero-valued fields get ignored.
    /// if you enter negative values, don't expect it to work correctly.
    /// if you only pass one value, it smartly assumes you mean max length
    /// to match behavior of StringLength.
    /// </summary>
    /// <param name="minLength">how short a string can be</param>
    /// <param name="maxLength">how long a string can be</param>

    public DCStringLength(int maximumLength, int minimumLength = 0) :base (maximumLength)
    {
        _minLength = minimumLength; 
        _maxLength = maximumLength; //so we can access them in the validator
        //when one value passed, swap them so max length validates right 
    }
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        int length = value?.ToString().Length ?? 0;
        if (_minLength == 0 && length > _maxLength)
           return new ValidationResult(Strings.Errors.General.TooLongError(validationContext.DisplayName, (int)_maxLength));
        else if (length < _minLength || length > _maxLength)
            return new ValidationResult(Strings.Errors.General.LengthError(validationContext.DisplayName, (int)_minLength, (int)_maxLength));
        return ValidationResult.Success;
    }
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...