ASP.NET MVC中的最小/最大值验证器


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可以是解决日期范围的另一种解决方案。这是我对另一个可能有用的问题的回答
Zinov

Answers:


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
仅供参考,这不会神奇地验证Javascript端的表单。您将需要为此编写其他代码+ js。
basarat

3
@basarat实际上您不需要额外的JS,jQuery验证库已经具有min / max的函数,您只需要IClientValidation在上述属性上实现接口并从GetClientValidationRules方法中返回正确的值
WickyNilliams 2013年

@WickyNilliams您会添加带有示例注释的答案,还是CharlesOuellet是否会以Wicky示例示例编辑此答案?我希望支持一个包含客户端验证的工作示例。
约翰尼·卡尔

@JohnieKarr我不再使用.NET了,所以我无法提供太多答案。就是说,下面的答案似乎恰好显示了我所描述的内容
WickyNilliams '16

195

我认为最小/最大验证属性不存在。我会用类似的东西

[Range(1, Int32.MaxValue)]

对于最小值1和

[Range(Int32.MinValue, 10)]

最大值10


4
嗯..对此不太满意。对我来说似乎有点不客气。
stiank81 2011年

21
这有点hacky ..但有时hacks让我感觉更舒服:)
Guy

4
只要您覆盖默认错误消息,否则此方法就很好,否则您将得到可怕的消息,例如:“属性x必须在-2e ^ 31-1和10之间。”
9尾巴2014年

2
怎么这么不客气和不舒服?对我来说似乎是个好方法。

1
RangeAttribute具有AllowMultiple = false,因此无法编译。
丹尼尔·席林

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

}

8
好答案。我会稍微修改错误消息:“输入一个大于或等于”的值是更正确的错误消息。
Tieson T. 2012年

0

jQuery Validation Plugin已经实现了最小和最大规则,我们只需要为我们的自定义属性创建一个适配器:

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属性将非常相似。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.