有3点很重要:
- 在表单内呈现日期时间字段时使用的格式
- 用于验证客户端上的日期时间字段的格式
- 用于验证服务器上的日期时间字段的格式
理想情况下,这 3 种格式必须相同。您提到您使用的是希腊文化,因此您可以从在 web.config 中配置它开始:
<globalization culture="el-GR" uiCulture="el-GR"/>
在这个阶段,显示日期时间字段和验证服务器上的日期时间字段的格式将是dd/MM/yyyy
因为这是 el-GR 文化使用的格式。
客户端验证是另一回事。它不受您的服务器配置的影响。它受客户端浏览器的设置和文化的影响。因此,即使您已将服务器配置为el-GR
用于验证日期时间,如果您将客户端浏览器配置为使用en-US
文化,那么客户端验证将使用该MM/dd/yyyy
格式。
因为客户端验证首先运行(假设您启用了 jquery 非侵入式验证),所以将使用 en-US 格式,即使该20/06/2012
值对您的服务器端文化有效,它也对客户端文化无效。为了解决这个问题,您需要使用jquery.globalize插件。因此,假设您想使用el-GR
文化,这里是您需要在 HTML 文档末尾添加的必要脚本:
<script type="text/javascript" src="~/Scripts/jquery-1.8.2.js"></script>
<script type="text/javascript" src="~/Scripts/jquery.validate.js"></script>
<script type="text/javascript" src="~/Scripts/jquery.validate.unobtrusive.js"></script>
<script type="text/javascript" src="~/Scripts/globalize.js"></script>
<script type="text/javascript" src="~/Scripts//globalize.culture.el-GR.js"></script>
<script type="text/javascript">
$.validator.methods.date = function (value, element) {
return this.optional(element) ||
!isNaN(Globalize.parseDate(value));
}
$.validator.methods.number = function (value, element) {
return this.optional(element) ||
!isNaN(Globalize.parseFloat(value));
}
Globalize.culture('el-GR');
</script>
注意插件的date
和number
方法是如何jquery.validate
被覆盖的,以便jquery.globalize
在解析这些值时使用插件。
当然,在你的页面中有这么多脚本并不是一件好事。在 ASP.NET MVC 4 中,您可以捆绑它们:
BundleTable.Bundles.Add(
new ScriptBundle("~/bundles/scripts")
.Include("~/Scripts/jquery-1.8.2.js")
.Include("~/Scripts/jquery.validate.js")
.Include("~/Scripts/jquery.validate.unobtrusive.js")
.Include("~/Scripts/globalize.js")
.Include("~/Scripts/globalize.culture.el-GR.js")
.Include("~/Scripts/myscript.js")
);
wheremyscript.js
将包含被覆盖的验证方法:
$.validator.methods.date = function (value, element) {
return this.optional(element) ||
!isNaN(Globalize.parseDate(value));
}
$.validator.methods.number = function (value, element) {
return this.optional(element) ||
!isNaN(Globalize.parseFloat(value));
}
Globalize.culture('el-GR');
现在,您可以将 Layout 中的所有这些脚本替换为单个包包含:
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
</head>
<body>
...
@Scripts.Render("~/bundles/scripts")
</body>
</html>
最后一步是解决在输入字段中呈现日期时间字段的值时使用的格式。当您使用Html.EditorFor()
帮助器为相应的模型属性生成输入字段时,此帮助器将默认使用当前文化。因此,例如,如果您有一个 DateTime 字段并el-GR
在 web.config 中设置了文化,则该值将呈现如下:
20/10/2012 12:21:22 μμ
如果要删除时间部分,可以使用[DisplayFormat]
属性装饰视图模型上的 DateTime 字段并指定要使用的自定义格式:
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
public DateTime SomeDateField { get; set; }
请记住,这仅指定呈现值时使用的格式。不要与我之前提到的验证相混淆。