2010-06-26 107 views
0

我已經通過服務層連接了我的驗證,並且我的Birthdate屬性如下所示。ASP.NET MVC2正則表達式的奇怪驗證問題(DataAnnotations)

<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客戶端驗證工作正常,但是當表單提交,服務器端驗證旅行,我告訴項是無效的。我使用jQuery-UI Datepicker輸入日期,但是當我禁用datepicker時,問題仍然存在。

我在這裏錯過了什麼嗎?我認爲客戶端和服務器端將是一回事。

事後反思。

難道是因爲我在我的SQL Server數據庫中使用 datetime2(0)

我測試了上述理論無濟於事......同樣的問題。

編輯:

如果我刪除

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

然後提交表單。這顯然是與正則表達式有關。

編輯:

下面的代碼也不管用,但我不知道是否有修改的ModelState之前它傳遞給isValid方法來正確地設置日期的方法嗎?

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

回答

2

假設用戶在文本字段中輸入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雖然可以很好地處理字符串屬性。

如果用戶輸入的日期無效,模型聯編程序將在驗證發生之前進行抗議。它還會檢查您的正則表達式不會生效的日期和月份。

+0

是的,但我也嘗試過在數據庫中的「日期」字段,它不指望時間字段。有沒有更好的方法來驗證輸入? – 2010-06-27 13:51:44

+0

您用於存儲數據庫中的字段的類型與模型綁定之間沒有關係。 – 2010-06-27 15:59:41

+0

我更新了一下我的問題。在傳遞給IsValid之前想知道修改ModelState Item。 – 2010-06-27 17:04:05