正常表达日期不起作用; MVC3 DataAnnotations

时间:2011-11-22 05:56:17

标签: c# regex asp.net-mvc-3 datetime

我在linq sql类的接口中使用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”。

我很确定我的表情很好,所以我不确定这是错的。

提前致谢。

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:2)

使用DateTime属性修饰[RegularExpression]字段没有任何意义。此属性与字符串类型一起使用。当您具有DateTime属性时,默认模型绑定器将使用当前区域性设置将请求值解析为DateTime,假设它是POST请求,并且如果它是GET请求,它将使用yyyy-MM-dd格式。因此,您可以看到它是默认的模型绑定器,负责将用户HTTP请求转换为DateTime字段的实例,并且RegularExpression验证器不起作用。

因此,如果您想将用户可以输入的日期限制为某种自定义格式,则可以使用custom model binder作为日期。

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