Min/Max-value validators in asp.net mvc

前端 未结 4 1832
时光说笑
时光说笑 2020-12-04 14:56

Validation using attributes in asp.net mvc is really nice. I have been using the [Range(min, max)] validator this far for checking values, like e.g.:



        
相关标签:
4条回答
  • 2020-12-04 15:26

    A complete example of how this could be done. To avoid having to write client-side validation scripts, the existing ValidationType = "range" has been used.

    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;
        }
    
    }
    
    0 讨论(0)
  • 2020-12-04 15:26

    jQuery Validation Plugin already implements min and max rules, we just need to create an adapter for our custom attribute:

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

    Adapter:

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

    Min attribute would be very similar.

    0 讨论(0)
  • 2020-12-04 15:33

    I don't think min/max validations attribute exist. I would use something like

    [Range(1, Int32.MaxValue)]
    

    for minimum value 1 and

    [Range(Int32.MinValue, 10)]
    

    for maximum value 10

    0 讨论(0)
  • 2020-12-04 15:36

    Here is how I would write a validator for 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;
            }
        }
    

    The MinValue Attribute should be fairly the same

    0 讨论(0)
提交回复
热议问题