Валідатори мінімального / максимального значення в mvc asp.net


106

Перевірка за допомогою атрибутів у asp.net mvc - це справді приємно. Я до цього часу використовую [Range(min, max)]валідатор для перевірки значень, наприклад, наприклад:

[Range(1, 10)]
public int SomeNumber { get; set; }

Однак - зараз мені потрібно перевірити стан мінімуму та максимуму окремо. Я очікував знайти такі атрибути:

[MinValue(1, "Value must be at least 1")]
[MaxValue(10, "Value can't be more than 10")]
public int SomeNumber { get; set; }

Чи є заздалегідь задані атрибути для написання цього? Або як я цього досягти?


FluentValidation може бути ще одним рішенням для вирішення діапазону дат. Ось моя відповідь на ще одне питання, яке може бути корисним .
Зінов

Відповіді:


48

Ось як я написав би валідатор для MaxValue

public class MaxValueAttribute : ValidationAttribute
    {
        private readonly int _maxValue;

        public MaxValueAttribute(int maxValue)
        {
            _maxValue = maxValue;
        }

        public override bool IsValid(object value)
        {
            return (int) value <= _maxValue;
        }
    }

Атрибут MinValue повинен бути приблизно однаковим


Гаразд, сподівався, що вони існують, але досить справедливо, щоб їх написати. Дякую!
stiank81

1
Просто FYI це не магічно підтвердило б форму на кінці Javascript. Для цього вам потрібно буде написати додатковий код + js.
базарат

3
@basarat насправді вам не знадобиться додатковий JS, у бібліотеці перевірки jquery вже є функції min / max, вам просто потрібно реалізувати IClientValidationінтерфейс на вищезазначеному атрибуті та повернути правильні значення з GetClientValidationRulesметоду
WickyNilliams

@WickyNilliams ви додасте відповідь на прикладі свого коментаря, чи CharlesOuellet буде редагувати цю відповідь на прикладі коментаря Вікі? Я хотів би підтримати робочий приклад, який включає перевірку на стороні клієнта.
Джонні Карр

@JohnieKarr Я більше не працюю з .NET, тому не можу надати багато відповідей. Це
означає

195

Я не думаю, що атрибут min / max валідацій існує. Я б використав щось подібне

[Range(1, Int32.MaxValue)]

для мінімальних значень 1 і

[Range(Int32.MinValue, 10)]

для максимального значення 10


4
Ммм .. Не зовсім комфортно з цим. Мені це виглядає трохи хакітно.
stiank81

21
Це трохи гакітно .. але іноді хаки змушують мене відчувати себе більш комфортно :)
Хлопець

4
Такий підхід чудовий, якщо ви скасуєте повідомлення про помилку за замовчуванням, або ви отримаєте щось жахливе на кшталт: "Властивість x має бути між -2e ^ 31-1 і 10".
Дев'ять хвостів

2
Як це хакі і незручно? Здається, до мене прекрасний підхід.

1
RangeAttributeмає AllowMultiple = false, тому це неможливо скласти.
Даніель Шиллінг

38

Повний приклад того, як це можна зробити. Щоб уникнути необхідності писати сценарії перевірки на стороні клієнта, використовувався існуючий ValidationType = "діапазон".

public class MinValueAttribute : ValidationAttribute, IClientValidatable
{
    private readonly double _minValue;

    public MinValueAttribute(double minValue)
    {
        _minValue = minValue;
        ErrorMessage = "Enter a value greater than or equal to " + _minValue;  
    }

    public MinValueAttribute(int minValue)
    {
        _minValue = minValue;
        ErrorMessage = "Enter a value greater than or equal to " + _minValue;
    }

    public override bool IsValid(object value)
    {
        return Convert.ToDouble(value) >= _minValue;
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        var rule = new ModelClientValidationRule();
        rule.ErrorMessage = ErrorMessage;
        rule.ValidationParameters.Add("min", _minValue);
        rule.ValidationParameters.Add("max", Double.MaxValue);
        rule.ValidationType = "range";
        yield return rule;
    }

}

8
Чудова відповідь. Я б трохи змінив повідомлення про помилку: "Введіть значення, що перевищує або дорівнює", - це більше (граматично) правильне повідомлення про помилку.
Тієсон Т.

0

Плагін jQuery Validation уже реалізує правила min та max, нам просто потрібно створити адаптер для нашого спеціального атрибута:

public class MaxAttribute : ValidationAttribute, IClientValidatable
{
    private readonly int maxValue;

    public MaxAttribute(int maxValue)
    {
        this.maxValue = maxValue;
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        var rule = new ModelClientValidationRule();

        rule.ErrorMessage = ErrorMessageString, maxValue;

        rule.ValidationType = "max";
        rule.ValidationParameters.Add("max", maxValue);
        yield return rule;
    }

    public override bool IsValid(object value)
    {
        return (int)value <= maxValue;
    }
}

Адаптер:

$.validator.unobtrusive.adapters.add(
   'max',
   ['max'],
   function (options) {
       options.rules['max'] = parseInt(options.params['max'], 10);
       options.messages['max'] = options.message;
   });

Min атрибут був би дуже схожий.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.