Валидаторы мин / макс значений в asp.net mvc - PullRequest
96 голосов
/ 31 августа 2011

Проверка с использованием атрибутов в 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; }

Есть ли предопределенные атрибуты для написания этого? Или как мне этого добиться?

Ответы [ 4 ]

172 голосов
/ 31 августа 2011

Я не думаю, что атрибут min / max валидации существует Я бы использовал что-то вроде

[Range(1, Int32.MaxValue)]

для минимального значения 1 и

[Range(Int32.MinValue, 10)]

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

44 голосов
/ 31 августа 2011

Вот как я бы написал валидатор для 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 должен быть примерно таким же

38 голосов
/ 14 июля 2012

Полный пример того, как это можно сделать.Чтобы избежать необходимости написания сценариев проверки на стороне клиента, использовался существующий ValidationType = "range".

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;
    }

}
1 голос
/ 25 мая 2016

Плагин проверки jQuery уже реализует правила 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 будет очень похож.

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