2011-11-22 51 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

对于其他值类型(如整数和双精度)也是如此。