Валидатор модельного ряда MVC?

Я хочу проверить дату и время, мой код:

    [Range(typeof(DateTime), 
     DateTime.Now.AddYears(-65).ToShortDateString(), 
     DateTime.Now.AddYears(-18).ToShortDateString(),
     ErrorMessage = "Value for {0} must be between {1} and {2}")]
    public DateTime Birthday { get; set; }

но я получаю сообщение об ошибке:

An attribute argument must be a constant expression, typeof expression or array creation expression of an attribute parameter type

пожалуйста, помогите мне?


person artwl    schedule 16.03.2012    source источник


Ответы (1)


Это означает, что значения атрибута 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; }
person mfanto    schedule 16.03.2012