【问题标题】:Min/Max-value validators in asp.net mvcasp.net mvc 中的最小值/最大值验证器
【发布时间】:2011-08-31 12:12:13
【问题描述】:

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

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

【问题讨论】:

标签: asp.net-mvc-3 validation


【解决方案1】:

我不认为 min/max 验证属性存在。 我会使用类似

[Range(1, Int32.MaxValue)]

对于最小值 1 和

[Range(Int32.MinValue, 10)]

最大值 10

【讨论】:

  • 嗯.. 对此不太满意。对我来说看起来有点 hacky。
  • 有点hacky..但有时hack让我感觉更舒服:)
  • 这种方法很好,只要你覆盖默认的错误信息,否则你会得到一些可怕的东西,比如:“属性 x 必须在 -2e^31-1 和 10 之间”。
  • 默认消息将显示为“字段 {field_name} 必须介于 1 和 2147483647 之间。”。我已经编辑了答案以添加自定义错误消息,您可以将其设置为更合理的内容。
  • 这是怎么回事?对我来说似乎是一个很好的方法。
【解决方案2】:

这是我将如何为 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 属性应该是差不多的

【讨论】:

  • 好的,期待它们存在,但足够公平地编写它们。谢谢!
  • 仅供参考,这不会神奇地验证 Javascript 端的表单。您需要为此编写额外的代码 + js。
  • @basarat 其实不需要额外的 JS,jquery 验证库已经有 min/max 的功能,你只需要在上面的属性上实现 IClientValidation 接口并返回正确的值来自GetClientValidationRules 方法
  • @WickyNilliams 您会用您的评论示例添加答案,还是 CharlesOuellet 您会用 Wicky 的评论示例编辑此答案?我很想推荐一个包含客户端验证的工作示例。
  • @JohnieKarr 我不再使用 .NET,所以我无法提供太多答案。也就是说,this answer below 似乎完全符合我的描述
【解决方案3】:

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

}

【讨论】:

  • 很好的答案。我会稍微修改一下错误消息:“输入大于或等于的值”是更(从语法上讲)正确的错误消息。
【解决方案4】:

jQuery Validation Plugin 已经实现了 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 属性会非常相似。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-16
    • 1970-01-01
    • 2019-02-09
    • 1970-01-01
    • 2017-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多