[Required(ErrorMessage = "Date is required")]
[RegularExpression(@"^(((0[1-9]|[12]\d|3[01])\/(0[13578]|1[02])\/((1[6-9]|[2-9]\d)\d{2}))|((0[1-9]|[12]\d|30)\/(0[13456789]|1[012])\/((1[6-9]|[2-9]\d)\d{2}))|((0[1-9]|1\d|2[0-8])\/02\/((1[6-9]|[2-9]\d)\d{2}))|(29\/02\/((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$", ErrorMessage="Date is not valid must be like (dd/mm/jjjj)")]
public DateTime Startdate{ get; set;}
客户端验证可以完美地工作。因此,看起来JavaScript可以成功地理解我的正则表达式。但当我回发时,modelstate.Isvalid()会被调用。
我的约会不再有效了。所以我猜测当.NET使用regEx执行匹配时,它并不匹配。
我的问题是:为什么这个正则表达式在客户端匹配,而在服务器端不匹配?
发布于 2010-05-02 23:50:07
这是因为当您执行回发数据绑定时,它无法将值解析为DateTime。顺便说一句,将RegularExpression属性放在DateTime类上并不是一个好主意。它有以下代码
public override bool IsValid(object value)
{
string str = Convert.ToString(value, CultureInfo.CurrentCulture);
if (string.IsNullOrEmpty(str))
{
return true;
}
Match match = this.Regex.Match(str);
return ((match.Success && (match.Index == 0)) && (match.Length == str.Length));
}
因此Convert.ToString(value,CultureInfo.CurrentCulture)永远不会与您的正则表达式匹配,因为它也会有时间部分。
你最好使用字符串而不是日期时间。
发布于 2010-05-02 23:47:06
我认为如果你想检查正则表达式,你应该使用:
public string Startdate{ get; set;}
然后在模型绑定后,在服务器端将其转换为DateTime
。您知道日期必须以特定的格式提供,但模型绑定器并不那么智能,并且会抛出错误。如果模型绑定后有DateTime
,那么使用正则表达式检查它是没有意义的,不是吗?首先是模型绑定,然后是验证。
发布于 2010-05-02 23:47:34
有没有可能客户端验证规则实际上并没有被应用?您是否检查了所需的属性是否按预期工作?您应该能够使用firebug来双重检查服务器端的正则表达式是否相同,所有值是否都符合预期,等等。
此外,也可能是插入的值通过了正则表达式,但模型绑定器仍然无法将其转换为日期时间,这也会产生模型错误。
我还没有检查您的正则表达式,看看它到底做了什么,但是如果您试图验证输入的日期是否有效,请改用DataTypeAttribute
。
https://stackoverflow.com/questions/2753864
复制相似问题