Я создал собственный валидатор 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;
}
}
Что я хотел бы сделать, так это выяснить, как это работает таким образом, чтобы валидатор по умолчанию функционировал.