Есть ли атрибут RangeAttribute для DateTime?

У меня есть поле Datetime в моей модели и нужно проверить его так, чтобы при его создании он должен падать между Теперь и 6 лет до. Я пробовал использовать диапазон, например

[Range(DateTime.Now.AddYears(-6), DateTime.Now)]
public DateTime Datetim { get; set; }

Но это порождает ошибку, которая не может преобразовать системное datetime в double. Может ли кто-нибудь предложить обходное решение для этого в самой модели?

Ответы

Ответ 1

Используйте этот атрибут:

public class CustomDateAttribute : RangeAttribute
{
  public CustomDateAttribute()
    : base(typeof(DateTime), 
            DateTime.Now.AddYears(-6).ToShortDateString(),
            DateTime.Now.ToShortDateString()) 
  { } 
}

Ответ 2

Даже если существует перегрузка для атрибута Range, который принимает значения типа и границы этого типа и допускает что-то вроде этого:

[Range(typeof(DateTime), "1/1/2011", "1/1/2012", ErrorMessage="Date is out of Range")]

то, что вы пытаетесь достичь, невозможно с помощью этого атрибута. Проблема в том, что атрибуты принимают только константы в качестве параметров. Очевидно, что ни DateTime.Now, ни DateTime.Now.AddYears(-6) не являются константами.

Однако вы все равно можете создать свой собственный атрибут проверки:

public class DateTimeRangeAttribute : ValidationAttribute
{
    //implementation
}

Ответ 3

Проверка jQuery не работает с RangeAttribute, за Рика Андерсона. Это делает неверным выбранное решение, если вы используете встроенную проверку подлинности JQuery ASP.NET MVC.

Вместо этого см. приведенный ниже код из этого ответа.

public class WithinSixYearsAttribute : ValidationAttribute
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        value = (DateTime)value;
        // This assumes inclusivity, i.e. exactly six years ago is okay
        if (DateTime.Now.AddYears(-6).CompareTo(value) <= 0 && DateTime.Now.CompareTo(value) >= 0)
        {
            return ValidationResult.Success;
        }
        else
        {
            return new ValidationResult("Date must be within the last six years!");
        }
    }
}

И он реализован как любой другой атрибут.

[WithinSixYears]
public DateTime SixYearDate { get; set; }