我正在使用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。
解决方案是什么?
答案 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。