asp.net mvc中的最小/最大值验证器

sti*_*k81 99 validation asp.net-mvc-3

使用asp.net mvc中的属性进行验证非常好.[Range(min, max)]到目前为止,我一直在使用验证器来检查值,例如:

[Range(1, 10)]
public int SomeNumber { get; set; }
Run Code Online (Sandbox Code Playgroud)

但是 - 现在我需要分别检查最小和最大条件.我希望找到这样的属性:

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

是否有任何预定义的属性来写这个?或者我如何实现这一目标?

Guy*_*Guy 183

我认为不存在min/max验证属性.我会用类似的东西

[Range(1, Int32.MaxValue)]
Run Code Online (Sandbox Code Playgroud)

最小值1和

[Range(Int32.MinValue, 10)]
Run Code Online (Sandbox Code Playgroud)

最大价值10

  • 这有点hacky ..但有时黑客让我觉得更舒服:) (20认同)
  • 嗯..对此不太满意.看起来有点hacky对我来说. (4认同)
  • 这种方法很好,只要你覆盖默认的错误信息,或者你会得到一些可怕的东西:"属性x必须介于-2e ^ 31-1和10"之间. (4认同)
  • 这个hacky和不舒服怎么样?对我来说似乎是一个很好的方法. (2认同)
  • `RangeAttribute` 具有 `AllowMultiple = false`,因此无法编译。 (2认同)

Cha*_*let 45

以下是我为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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

MinValue属性应该完全相同

  • 仅供参考,这不会神奇地验证 Javascript 端的表单。您需要为此编写额外的代码+js。 (3认同)
  • @basarat实际上你不需要额外的JS,jquery验证库已经有min/max函数,你只需要在上面的属性上实现`IClientValidation`接口并从`GetClientValidationRules`方法返回正确的值 (3认同)

小智 38

如何做到这一点的完整示例.为避免编写客户端验证脚本,已使用现有的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;
    }

}
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案.我会稍微修改错误消息:"输入大于或等于的值"是更多(语法上说)正确的错误消息. (8认同)