[displayFormat(DataFormatString = "{0:d}",ApplyFormatInEditMode=true)] [RegularExpression(@"^(([0-2]\d|[3][0-1])\.([0]\d|[1][0-2])\.[2][0]\d{2})$",ErrorMessage="Failed...")] public DateTime MyDate { get; set; }
HttpPost的控制器操作签名如下所示:
[HttpPost] public ActionResult Edit(int id,Myviewmodel viewmodel) { // Myviewmodel contains the MyDate property ... // ... if (ModelState.IsValid) { // ... } // ... }
在Razor视图中,我尝试了以下两种方式:
> @ Html.TextBoxFor(model => model.MyDate)
> @ Html.EditorFor(model => model.MyDate)
它不能按我的意愿工作.结果是:
>客户端验证与两个Html帮助程序一样正常工作
>对于两个帮助程序,服务器端验证总是失败,即使是通过正则表达式的有效日期(如“17.06.2011”)也是如此.使用viewmodel中输入的日期正确填充MyDate属性,该日期将传递给操作.所以似乎模型绑定工作正常.
> displayFormat属性仅受EditorFor尊重,但不受TextBoxFor的尊重. TextBoxFor显示“dd.mm.yyyy hh:mm:ss”
问题:
>我可以在不是字符串的属性上应用RegularExpressionAttribute吗?如果允许,如何在服务器端对Date字符串等非字符串属性评估reg ex?类似于MyDate.ToString()与reg ex相比? (它会解释验证失败,因为ToString将返回一个包含时间部分的字符串,该字符串不会传递正则表达式.)
> displayFormat属性通常只受EditorFor尊重,而不是TextBoxFor吗?
>我该如何进行日期验证呢?
解决方法
文化差异可能是问题的根源.客户端验证使用浏览器的文化来验证日期.因此,例如,如果将其配置为en-US,则预期格式将为MM / dd / yyyy.如果您的服务器配置为使用fr-FR,则预期格式为dd / MM / yyyy.
您可以使用web.config中的<globalization>
元素来设置服务器端文化.您可以使用与客户端相同的文化来配置它:
<globalization culture="auto" uiCulture="auto"/>
Hanselman在ASP.NET MVC中有关于全球化和本地化的nice blog post.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。