【问题标题】:MVC 4 date culture issue?MVC 4 日期文化问题?
【发布时间】:2013-08-31 13:45:37
【问题描述】:

我正在使用 MVC 4 并且想知道 Datetime 文化信息中是否存在错误?

我正在尝试让澳大利亚日期工作 (dd/MM/yyyy),但它一直说日期格式错误,即使在将 globalizaton 放入 web.config 之后也是如此。我认为这是我的代码错误,但即使您开始一个新项目,它仍然会发生。

我启动了一个新的 MVC 4 Web 应用程序。

在 web.config 文件中添加了以下内容

<globalization culture="en-AU" uiCulture="en-AU" />

然后我将以下内容添加到 AccountModels.cs 文件中:

[DataType(DataType.DateTime)]
[Required(ErrorMessage="Date is required")]
public DateTime? MyDate { get; set; }

然后我将以下内容添加到 Register.cshtml 文件中:

<li>
    @Html.LabelFor(m => m.MyDate)
    @Html.TextBoxFor(m => m.MyDate)
</li>

运行应用程序,进入注册页面,尝试使用 26/03/2013 之类的日期,但显示格式无效。

请帮忙。

【问题讨论】:

    标签: asp.net-mvc-4


    【解决方案1】:

    尝试将此属性添加到您的 MyDate 属性:

    [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
    

    虽然在 web.config 中设置文化应该这样做,但这应该强制它进入那种格式。

    更新

    好的,所以上面的答案并不能真正解决问题,但如果您确实想更改日期最初显示的格式,这一点很重要。一个重要的注意事项是 DisplayFormat 属性不是由 TextBoxFor 助手获取的,而是由 EditorFor 助手获取的。

    无论如何,还是要找到真正的解决方案。问题是 jQuery 验证在解析日期时没有考虑文化。如果您关闭客户端验证,则可以在知道文化的服务器上正常解析日期。

    修复方法是覆盖 jQuery 对日期的验证并包含一个额外的 jQuery 全球化插件。你可以找到全球化插件here。您还可以使用 Nuget 包管理器轻松下载插件。我刚刚打开包管理器,选择左侧的 Online 选项卡并在搜索中输入“globalize”,这是第一个结果。一旦你安装了它,我就包含了这两个文件:

    全球化.js
    globalize.culture.en-AU.js

    您可以使用脚本标记直接包含它们,也可以将它们放在一个包中,也许与其他 jQuery 验证文件一起。

    一旦你有了这些,你需要添加以下脚本来覆盖 jQuery 对日期的验证:

    <script type="text/javascript">
        $(function () {
            $.validator.methods.date = function (value, element) {
                Globalize.culture("en-AU");
                // you can alternatively pass the culture to parseDate instead of
                // setting the culture above, like so:
                // parseDate(value, null, "en-AU")
                return this.optional(element) || Globalize.parseDate(value) !== null;
            }
        });
    </script>
    

    就是这样,这应该可以解决问题。我将此解决方案归功于此答案:JQuery Validation and MVC 3. How to change date format 我只是还想针对您的问题提供更多解释。

    【讨论】:

    • 那行不通。您可以尝试创建一个新项目并按照步骤操作吗?我要疯了,试图解决这个问题..这是我的安装问题吗?我的机器?我正在使用 IIS Express,因为我直接从 vs2012 运行它。这可能是问题吗?
    • 这里是我的项目的链接,它只是一个带有上述更改的全新项目。dl.dropboxusercontent.com/u/87611366/MvcApplication2.zip
    • 我会在本地尝试一下,看看会发生什么。我在全球化应用程序或改变文化方面没有太多经验,但这应该是必要的。
    • 好的,我相信我明白了!事实证明,在 web.config 中设置文化几乎是您需要做的所有事情,UNLESS 您正在使用 jQuery 验证。当我省略客户端验证时,日期工作正常,当我包含它时,它抱怨您所说的格式。修复方法是覆盖对日期的 jQuery 验证,并包含一个额外的 jQuery globalize 库,该库允许以其他文化格式解析日期。查看我的答案中的更新以获得完整的解释。
    • asymptoticFault - 你太棒了,非常感谢你。有效。你是一个学者,一个绅士。再次感谢,非常感谢您的帮助。
    【解决方案2】:

    接受的答案不是最新的。 我的最终解决方案:

    $(function () {
        $.validator.methods.date = function (value, element) {
            return this.optional(element) || moment(value, "DD.MM.YYYY", true).isValid();
        }
    });
    

    之前必须包含:

    @Scripts.Render("~/Scripts/jquery-3.1.1.js")
    @Scripts.Render("~/Scripts/jquery.validate.min.js")
    @Scripts.Render("~/Scripts/jquery.validate.unobtrusive.min.js")
    @Scripts.Render("~/Scripts/moment.js")
    

    您可以使用以下方式安装 moment.js:

    Install-Package Moment.js
    

    【讨论】:

    • 谢谢,这个适用于 MVC5。太糟糕了,没有 MVC5 的“标准化”文件了......
    【解决方案3】:

    创建代理函数怎么样?

    var _date = $.validator.methods.date;
    
    $.validator.methods.date = function (value, element) {
        return _date.call(this, Globalize.parseDate(value), element);
    };
    

    【讨论】:

      【解决方案4】:

      在下面的其他土耳其文化中。

      <globalization 
      fileencoding="utf-8" 
      requestencoding="utf-8" 
      responseencoding="utf-8" 
      culture="tr-TR" 
      uiculture="tr-TR"/>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多