在ASP.NET MVC 3中以特定格式验证日期

我的viewmodel中有一个DateTime MyDate类型的属性.我想确保用户只在特定格式(dd.mm.yyyy)的文本框中输入Date部分,并尝试以下属性

[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.

相关文章

### 创建一个gRPC服务项目(grpc服务端)和一个 webapi项目(...
一、SiganlR 使用的协议类型 1.websocket即时通讯协议 2.Ser...
.Net 6 WebApi 项目 在Linux系统上 打包成Docker镜像,发布为...
一、 PD简介PowerDesigner 是一个集所有现代建模技术于一身的...
一、存储过程 存储过程就像数据库中运行的方法(函数) 优点:...
一、Ueditor的下载 1、百度编辑器下载地址:http://ueditor....