2

我正在尝试使用本教程来了解有关 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没有 pm 和 am 24 小时)

但是,如果我至少可以在没有错误的情况下进行编辑和保存,我现在会很高兴:)

4

1 回答 1

2

有3点很重要:

  1. 在表单内呈现日期时间字段时使用的格式
  2. 用于验证客户端上的日期时间字段的格式
  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>

注意插件的datenumber方法是如何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; }

请记住,这仅指定呈现值时使用的格式。不要与我之前提到的验证相混淆。

于 2012-10-17T09:19:41.037 回答