Asp.net MVC 设置验证日期格式在 Chrome 上失败

Posted

技术标签:

【中文标题】Asp.net MVC 设置验证日期格式在 Chrome 上失败【英文标题】:Asp.net MVC set validation date format fails on Chrome 【发布时间】:2012-10-11 18:04:09 【问题描述】:

我在 asp.net mvc 中设置验证日期格式 Chrome 时遇到问题,对于 IE 等其他浏览器,Firefox 可以正常工作。

我已经在我的模型中定义了日期,比如下一个代码:

[Required]
[Display(Name = "Data fi publicació")]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "0:dd/MM/yyyy")]
public DateTime PublishingEndDate  get; set; 

在我看来:

@html.TextBoxFor(model => model.PublishingEndDate)
@Html.ValidationMessageFor(model => model.PublishingEndDate)

问题似乎@Html.ValidationMessageFor 使用MM/dd/yyyy 格式验证日期,但我想要的是使用欧洲格式dd/MM/yyyy 进行验证。如何将默认文化验证格式日期更改为 dd/MM/yyyy

感谢您的帮助

【问题讨论】:

这里问了一个类似的问题:***.com/questions/5199835/… 【参考方案1】:

最后我发现这个问题只影响 Chrome,用 IE,Firexfox 完美运行,似乎是一个 chrome 错误,我在http://forums.asp.net/t/1729179.aspx/1找到了解决方案

必须使用以下代码覆盖 jquery 的验证器方法:

$(document).ready(function () 
    $('.calendarPicker').datepicker( dateFormat: "dd/mm/yy" );

$.validator.addMethod('date',
    function (value, element, params) 
        if (this.optional(element)) 
            return true;
        

        var ok = true;
        try 
            $.datepicker.parseDate('dd/mm/yy', value);
        
        catch (err) 
            ok = false;
        
        return ok;
    );
);

【讨论】:

我的问题是,如果我在日期选择器中选择了第二个日期,它会给我一个验证错误 - 仅在 Chrome 中(使用 40.0.2214.115)。该解决方案在原始问题发布近三年后修复了它!不错!【参考方案2】:

确保您已在 web.config 中设置文化。这将为所选的文化使用适当的日期和数字格式。

http://msdn.microsoft.com/en-us/library/bz9tc508(v=vs.100).aspx

【讨论】:

【参考方案3】:

这对我有帮助:

$(function() 
            $(".datepicker").datepicker(
                todayBtn: true,
                language: "en-GB",
                format: "dd/mm/yyyy",
                clearBtn: true,
                pickTime: false
            );

            $.validator.addMethod("date",
                function(value, element) 
                    return this.optional(element) || parseDate(value, "dd-MM-yyyy") !== null;
                );
        );

【讨论】:

【参考方案4】:

为避免客户端验证,您不希望任何与输入关联的 data-val 属性。所以我所做的是写下纯 HTML,而不是使用 TextFor 或 EditorFor 等...

<input type="text" class="datepicker form-control">

对我来说很好......

【讨论】:

【参考方案5】:

如果您不想使用日期时间选择器:

由于 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();
    
);

【讨论】:

以上是关于Asp.net MVC 设置验证日期格式在 Chrome 上失败的主要内容,如果未能解决你的问题,请参考以下文章

asp.net mvc 代码优先方法中的日期验证

有效日期的 Asp.net MVC DateTime 错误

ASP.NET MVC 验证器无法识别引导程序 DatePicker 格式

使用日期时间选择器进行日期和时间验证 (ASP.Net MVC Core v1.1)

ASP.NET MVC JsonResult 日期格式

正确格式化 AngularJS 的 ASP.NET MVC 日期