ASP.NET MVC2 Странная проблема проверки с регулярным выражением (DataAnnotations) - PullRequest
0 голосов
/ 26 июня 2010

У меня есть проверка на моем слое Service, и мое свойство Birthdate выглядит следующим образом.

    <DisplayName("birthdate")> _
    <RegularExpression("^\d{2}\/\d{2}\/\d{4}$", ErrorMessage:="Birthdate is not in the correct format.")> _
    <DisplayFormat(ApplyFormatInEditMode:=True, ConvertEmptyStringToNull:=True, DataFormatString:="{0:MM/dd/yyyy}")> _
    Public Property BirthDate As DateTime

Проверка на стороне клиента работает правильно, если я ввожу что-то вроде 12/12/1990, но когда форма отправлена, проверка на стороне сервера отключается, и мне говорят, что запись недействительна. Я использую DatePicker jQuery-UI для ввода даты, однако, когда я отключаю DatePicker, проблема не устраняется.

Я что-то здесь упускаю? Я думал, что сторона клиента и сторона сервера будут одним и тем же.

* ** 1008 1009 * второстепенным.

Может быть, потому что я использую datetime2(0) в своей базе данных SQL Server?

Я проверил приведенную выше теорию безрезультатно ... та же проблема.

EDIT:

Если я удалю

<RegularExpression("^\d{2}\/\d{2}\/\d{4}$", ErrorMessage:="Birthdate is not in the correct format.")>

Затем форма отправляется. Очевидно, это как-то связано с Regex.

EDIT:

Следующий код тоже не работает, но мне интересно, есть ли способ изменить modelState, чтобы правильно установить дату перед передачей в метод IsValid?

    Dim birthdate As String = user.BirthDate
    ModelState.Item("BirthDate") = DateTime.Parse(birthdate)

1 Ответ

2 голосов
/ 27 июня 2010

Предположим, что пользователь вводит 06/27/2010 в текстовое поле и отправляет форму.

  1. Связыватель модели по умолчанию запускается и пытается связать то, что пользователь ввел в вашу модель.Свойство BirthDate имеет тип DateTime, и, как вы знаете, этот тип содержит часть часа.Так что теперь BirthDate = 6/27/2010 12:00:00 AM

  2. Проверка запускается следующим.Свойство BirthDate украшено атрибутом RegularExpression, поэтому метод IsValid вызывается со строковым значением 6/27/2010 12:00:00 AM, что не соответствует вашему шаблону.

  3. Соответствующее сообщение об ошибке показывается пользователю.

Таким образом, использование этого атрибута регулярного выражения сомнительно. RegularExpressionAttribute отлично работает со строками.

Если пользователь введет недопустимую дату, связыватель модели все равно будет протестовать задолго до того, как произойдет проверка.Он также проверит недействительные дни и месяцы, которых нет в вашем регулярном выражении.

...