2011-11-22 34 views
3

在linq sql類的接口中使用DataAnnotations。 這一切都很好。日期的正則表達式不起作用; MVC3 DataAnnotations

林具有與該日期時間字段問題

我的代碼如下:

[DataType(DataType.Date)] 
    [RegularExpression(@"^([1-9]|0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\d\d$", ErrorMessage = "regexFail")] 
    DateTime? DateofBirth { get; set; } 

現在的數據類型表達做工精細,它帶來了一個日期,而不是日期時間。 問題在於字段的驗證。我的正則表達式不匹配日期,即使我把它放入引擎中,但它確實如此。例如,我把「10/10/2010」放在字段中,我得到錯誤「regexFail」。

我很確定我的表情很好,所以我不確定最新的錯誤。

在此先感謝。

+0

這是故意的歐洲風格的日期格式(D/M/Y與M/D/Y)嗎? – phatfingers

+0

澳大利亞約會 – MrJD

回答

3

我認爲正在發生的是DateTime值正在轉換爲一個字符串,然後匹配模式。如果是這種情況,並且正在使用ToString,則默認時間12:00:00 AM將包含在匹配的字符串中。

我嘗試下面的代碼和IsValid返回true

string pattern = @"^([1-9]|0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\d\d\s12:00:00\sAM$"; 

RegularExpressionAttribute attribute = new RegularExpressionAttribute(pattern) { ErrorMessage = "regexFail" }; 
DateTime dt = new DateTime(2010, 10, 10); 

bool isValid = attribute.IsValid(dt); 
2

裝飾一DateTime場與[RegularExpression]屬性沒有任何意義。該屬性與字符串類型一起使用。如果有DateTime屬性,默認模型聯編程序將使用當前區域性設置將請求值解析爲DateTime,前提是它是POST請求,如果它是GET請求,它將使用yyyy-MM-dd格式。因此,您可以看到它是默認模型綁定器,負責將用戶HTTP請求轉換爲DateTime字段的實例,並且RegularExpression驗證器不起作用。

所以,如果你想限制用戶可以輸入一些自定義格式的日期,你可以使用日期爲custom model binder

對於其他值類型(如整數和雙精度)也是如此。