MVC 4如何通过客户端验证验证非美国日期?

时间:2013-08-31 10:12:56

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

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

我的视图模型如下,

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

的index.html

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

我已更新了我的web.config

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

我错过了什么?

由于

4 个答案:

答案 0 :(得分:26)

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

以下是我用过的链接信息......

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

修复是覆盖日期的jQuery验证,并包含一个额外的jQuery全球化插件。您可以找到globalize插件here。您也可以使用Nuget Package Manager轻松下载插件。我刚打开包管理器,选择左侧的在线选项卡,在搜索中输入“globalize”,这是第一个结果。安装完成后,我将这两个文件包括在内:

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>

答案 1 :(得分:9)

由于 jquery.validate.unobtrusive.min.js 中的MVC错误(即使在MVC 5中),不以任何方式接受日期/日期时间格式,因此可能会发生客户端验证问题< / strong>即可。不幸的是你必须手动解决它。

我的最终解决方案:

您必须先包括:

@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();
    }
});

答案 2 :(得分:4)

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

该解决方案已在Fixing jQuery non-US Date Validation for Chrome

提交

答案 3 :(得分:-2)

试试这个,

查看

<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; }