我正在尝试使用this tutorial来了解更多关于MvC4的信息,但我对Datetime
字段有一些问题。
第一个问题:
当我尝试使用此格式的datetime
创建条目时:DD/MM/YYYY
(例如20/06/2012
),我收到错误消息:
字段ReleaseDate必须是日期
所以我猜它需要采用这种格式(一般来说是默认的):MM/DD/YYYY
(例如06/20/2012
)。
当我使用第二种格式时,我收到一条消息:
值'06 / 20/2012'对于ReleaseDate无效。
我可以让它工作的唯一方法是当我输入月份和日期<= 12时。 12/12/2012
。
第二个问题:
这是关于时间的。假设我输入12/12/2012
,我就可以成功创建一个条目。默认情况下,它会选择12:00:00 pm
作为时间戳。事情是,而不是pm它进入μμ(这是希腊语中的pm,因为我的电脑中的时钟是希腊语)
当我尝试编辑条目时,我因此而收到错误。如果我将μμ改为pm,则接受它。但它很奇怪,有点讨厌从有效条目中获取错误而不改变任何东西。
第三个问题(奖金):
我有一个数字字段。我输入例如199
并接受它。但在我的列表中,它显示为199,00
。当我再次尝试编辑并单击“保存”时,出现此错误:
字段价格必须是数字。
如果我删除了逗号而00又删除了它..
正如你可以看到它是一个非常有问题的表格:)任何帮助我解决任何问题的答案都非常受欢迎。
理想情况下,我希望这种格式的日期时间:DD/MM/YYYY hh:mm:ss
(没有下午和24小时)
但如果我至少可以在没有错误的情况下进行编辑和保存,我会很高兴:)
答案 0 :(得分:2)
有三件重要的事情:
理想情况下,这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")
);
其中myscript.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');
现在,您可以使用单个捆绑包替换布局中的所有脚本:
<!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字段并且在web.config中将文化设置为el-GR
,则该值将如下呈现:
20/10/2012 12:21:22 μμ
如果要删除时间部分,可以使用[DisplayFormat]
属性修饰视图模型上的DateTime字段,并指定要使用的自定义格式:
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
public DateTime SomeDateField { get; set; }
请记住,这仅指定呈现值时使用的格式。不要混淆我之前提到的验证。