【问题标题】:Data Annotations Range validator for date日期的数据注释范围验证器
【发布时间】:2014-04-29 22:53:40
【问题描述】:

我正在使用范围验证器来验证日期。我的要求是验证输入日期应该在当前日期和当前日期 -60 年之间。

这是我迄今为止尝试过的,

[Range(typeof(DateTime),DateTime.UtcNow.ToString(),DateTime.UtcNow.AddYears(-60).Date.ToString())]
public DateTime? DOJ { get; set; }

但这会引发错误:属性参数必须是属性参数类型的常量表达式、typeof 表达式或数组创建表达式。

所以我修改了我的代码:

 #region variables
 public const string MaxDate = DateTime.UtcNow.ToString();
 public const string MinDate = DateTime.UtcNow.AddYears(-60).Date.ToString();
 #endregion

并设置属性:

[Range(typeof(DateTime),maximum:MaxDate,minimum:MinDate)]
public DateTime? DOJ { get; set; }

现在的错误是:分配给“MaxDate”的表达式必须是常量。

MinDate 也是如此。

解决办法是什么?

【问题讨论】:

    标签: validation data-annotations


    【解决方案1】:

    您不能在属性中使用变量。属性中的所有项目都必须是常量。如果要根据动态值过滤值,则可以像这样创建新的 ValidationAttribute:

    public class ValidateYearsAttribute : ValidationAttribute
    {
        private readonly DateTime _minValue = DateTime.UtcNow.AddYears(-60);
        private readonly DateTime _maxValue = DateTime.UtcNow;
    
        public override bool IsValid(object value)
        {
            DateTime val = (DateTime)value;
            return val >= _minValue && val <= _maxValue;
        }
    
        public override string FormatErrorMessage(string name)
        {
            return string.Format(ErrorMessage, _minValue, _maxValue);
        }
    }
    

    然后你只需要把它放在你的财产上:

     [ValidateYears]
     public DateTime? DOJ { get; set; }
    

    您可以根据需要更新 FormatErrorMessage。

    【讨论】:

    • 我想知道这是否适用于客户端的验证器或仅适用于后端。
    • @Sam 不会。您需要在客户端添加类似的验证检查并将它们链接在一起,因此当您在模型端使用属性时,它也会在客户端进行验证
    猜你喜欢
    • 1970-01-01
    • 2013-10-06
    • 1970-01-01
    • 2016-03-15
    • 2023-03-11
    • 2023-04-07
    • 2011-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多