Валидатор модельного ряда MVC? - PullRequest
4 голосов
/ 16 марта 2012

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

    [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

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

1 Ответ

12 голосов
/ 16 марта 2012

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