Это означает, что значения атрибута Range не могут быть определены позднее, его нужно определить во время компиляции. DateTime.Now не является константой, она меняется в зависимости от того, когда выполняется код.
То, что вы хотите, это пользовательский валидатор DataAnnotation. Вот пример того, как его построить:
Как создать собственные средства проверки аннотаций данных
Поместите вашу логику проверки даты в IsValid ()
Вот реализация. Я также использую DateTime.Subtract () в отличие от отрицательных лет.
public class DateRangeAttribute : ValidationAttribute
{
public int FirstDateYears { get; set; }
public int SecondDateYears { get; set; }
public DateRangeAttribute()
{
FirstDateYears = 65;
SecondDateYears = 18;
}
public override bool IsValid(object value)
{
DateTime date = DateTime.Parse(value); // assuming it's in a parsable string format
if (date >= DateTime.Now.AddYears(-FirstDateYears)) && date <= DateTime.Now.AddYears(-SecondDateYears)))
{
return true;
}
return false;
}
}
Использование:
[DateRange(ErrorMessage = "Must be between 18 and 65 years ago")]
public DateTime Birthday { get; set; }
Он также является общим, поэтому вы можете указать новые значения диапазона для лет.
[DateRange(FirstDateYears = 20, SecondDateYears = 10, ErrorMessage = "Must be between 10 and 20 years ago")]
public DateTime Birthday { get; set; }