【问题标题】:MVC 4 how to validate a non-US date with client validation?MVC 4 如何通过客户端验证来验证非美国日期?
【发布时间】:2025-12-29 20:25:11
【问题描述】:

我遇到了在客户端验证日期时间字段时遇到问题的情况。当我尝试提交时,它一直告诉我日期无效(27/7/2013)。但是,如果我将日期转换为美国格式,它就可以工作(2013 年 7 月 27 日)。

我的视图模型如下,

[DataType(DataType.Date), DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
public DateTime? AuditDate { get; set; }

索引.html

 @Html.TextBoxFor(m => m.AuditDate)

我已经更新了我的 web.config

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

我错过了什么?

谢谢

【问题讨论】:

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-4


【解决方案1】:

其他人为我排序,这完全与客户端 Jquery 验证有关。 再次感谢 asymptoticFault .. 你摇滚.. MVC 4 date culture issue?

这是我使用的链接中的信息...

问题是 jQuery 验证在解析日期时没有考虑文化。如果您关闭客户端验证,则可以在知道文化的服务器上正常解析日期。

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

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>

【讨论】:

  • 如果您在此处提供答案的要点以及链接失效的情况会很好。
  • 它工作正常,但是当我使用 Nuget (nuget.org/packages/jquery-globalize) 下载 Globalizejs 时,文件“globalize.culture.en-AU.js”不存在,但不是必需的。只需使用“globalize.js”就可以了
【解决方案2】:

由于 jquery.validate.unobtrusive.min.js 中的 MVC 错误(甚至在 MVC 5 中)可能会出现客户端验证问题,该错误不接受任何日期/日期时间格式。不幸的是,您必须手动解决它。

我的最终解决方案:

之前必须包含:

@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

然后你终于可以为日期格式解析器添加修复:

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

【讨论】:

  • 谢谢,随意使用任何你想要的日期格式(moment.js 可以处理我想的一切)。 :)
【解决方案3】:

当使用 jQuery 验证日期时,您会发现它不适用于使用 Chrome 的日期。当您使用非美国语言环境时会发生这种情况。

解决方案已提交至Fixing jQuery non-US Date Validation for Chrome

【讨论】:

    【解决方案4】:

    试试这个,

    查看

    <div>
                    @Html.LabelFor(m => m.DOB)
                    @Html.TextBoxFor(m => m.DOB, new { @Formate = "dd/MM/yyyy" })
                    @Html.ValidationMessageFor(m => m.DOB)
    
                </div>
    

    型号

    [DisplayName("Date Of Birth")][DataType(DataType.Date)]
    public DateTime DOB { get; set; }
    

    【讨论】:

    • 同样的结果.. 行不通... 改变文化肯定不是那么复杂
    • 这并没有解决客户端验证中的错误,这是问题