Сбой проверки правильности регулярного выражения модели ASP.Net MVC 2 - PullRequest
2 голосов
/ 29 августа 2010

В моем классе метаданных модели есть следующее свойство:

[Required(ErrorMessage = "Spent On is required")]
[RegularExpression(@"[0-1][0-9]/[0-3][0-9]/20[12][0-9]", 
   ErrorMessage = "Please enter date in mm/dd/yyyy format")]
[DataType(DataType.Date)]
[DisplayName("Spent On")]
public DateTime SpentOn { get; set; }

Но всякий раз, когда я вызываю ModelState.IsValid, оно всегда возвращает false, поскольку регулярное выражение не проверяется.Я сопоставил введенную дату (29.08.2010) с новым регулярным выражением, используя тот же шаблон, и он идеально соответствует.

Что я делаю не так?

Ответы [ 2 ]

4 голосов
/ 24 ноября 2010

На самом деле есть другой обходной путь для этого. Вы можете просто создать подкласс RegularExpressionAttribute

public class DateFormatValidatorAttribute : RegularExpressionAttribute {
    public DateFormatValidatorAttribute()
        : base(@"[0-1][0-9]/[0-3][0-9]/20[12][0-9]") 
        {
            ErrorMessage = "Please enter date in mm/dd/yyyy format";
        }

        public override bool IsValid(object value) {
            return true;
        }
}

в вашем Global.asax.cs при запуске приложения зарегистрируйте надстройку RegularExpression для проверки на стороне клиента следующим образом:

DataAnnotationsModelValidatorProvider.RegisterAdapter(
            typeof(DateFormatValidatorAttribute), 
                typeof(RegularExpressionAttributeAdapter));

Теперь у вас есть встроенная клиентская сторона валидатора MVC для регулярных выражений, и вы используете DateTime в качестве типа вашего свойства

2 голосов
/ 29 августа 2010

Это потому, что регулярное выражение применяется к строкам, а не к DateTime свойствам. Если пользователь вводит недопустимую строку, которую невозможно проанализировать для экземпляра DateTime из подшивки модели, он добавит общее сообщение об ошибке до того, как ваш шаблон регулярного выражения будет выполнен.

У вас есть несколько возможностей:

  1. Настройка сообщения об ошибке в файле ресурсов
  2. Написать пользовательское связующее для модели
  3. Используйте строковое свойство (я чувствую себя виноватым, предложив это: -))
...