数据注释范围验证器的日期

时间:2013-12-25 13:32:23

标签: validation data-annotations

我正在使用Range Validator来验证日期。我的要求是验证输入日期应该在当前日期和当前日期-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。

解决方案是什么?

1 个答案:

答案 0 :(得分:2)

您无法在属性中使用变量。属性中的所有项必须是常量。如果要根据动态值过滤值,则可以像这样制作新的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。