字段日期必须是以chrome为单位的mvc日期

Kar*_*ala 26 asp.net-mvc jquery jquery-ui-datepicker asp.net-mvc-4

我正在做一个简单的MVC4互联网应用程序,它允许在类别中添加一些项目.

这是我到目前为止所做的.

我在mvc视图中有一个日期选择器.datepicker的脚本是这样的.

<script src="@Url.Content("~/Scripts/jquery-1.7.1.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery-ui-1.8.20.min.js")" type="text/javascript"></script>
@Scripts.Render("~/bundles/jqueryval")
<script type="text/javascript">
    $(function () {
        $('#dtItemDueDate').datepicker({
            dateFormat: 'dd/mm/yy',
            minDate: 0
        });
    });
</script>
Run Code Online (Sandbox Code Playgroud)

我的模特财产:

        [DisplayName("Item DueDate")]
        [Required]
        [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}",ApplyFormatInEditMode = true)]
        [DataType(DataType.DateTime)]
        public DateTime? dtItemDueDate { get; set; }
        public char charCompleted { get; set; }
Run Code Online (Sandbox Code Playgroud)

在我看来,我做到了这一点:

@Html.TextBoxFor(m => m.dtItemDueDate)
@Html.ValidationMessageFor(m => m.dtItemDueDate)
Run Code Online (Sandbox Code Playgroud)

错误是这样的:

The field Item DueDate must be a date.
Run Code Online (Sandbox Code Playgroud)

奇怪的是,它确实在IE和Mozilla中工作,但在Chrome中不起作用.

我在SO上发现了很多帖子,但没有一个有用

有什么想法/建议吗?

Mah*_*esh 43

在不更改jquery.validate.js的情况下,您可以使用下面的代码片段$(document).ready():

jQuery.validator.methods.date = function (value, element) {
    var isChrome = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);
    if (isChrome) {
        var d = new Date();
        return this.optional(element) || !/Invalid|NaN/.test(new Date(d.toLocaleDateString(value)));
    } else {
        return this.optional(element) || !/Invalid|NaN/.test(new Date(value));
    }
};
Run Code Online (Sandbox Code Playgroud)


Row*_*man 30

编者注:这个答案不再有效,从jQuery 1.9(2013)开始,该$.browser方法已被删除


根据这篇文章,它是基于Webkit的浏览器的一个已知的怪癖.

一种解决方案是jquery.validate.js通过查找函数进行修改date: function (value, element)并将此代码放入其中:

if ($.browser.webkit) {
    //ES - Chrome does not use the locale when new Date objects instantiated:
    var d = new Date();
    return this.optional(element) || !/Invalid|NaN/.test(new Date(d.toLocaleDateString(value)));
}
else {
    return this.optional(element) || !/Invalid|NaN/.test(new Date(value));
}
Run Code Online (Sandbox Code Playgroud)

  • $ .browser方法已被弃用了一段时间,并且从jQuery 1.9开始已被删除. (8认同)
  • 以上不是解决此问题的正确方法.首先,您不应该再次更改jquery验证源代码,如上所述$ .browser.webkit已弃用.实现此修复的方法是简单地添加此jQuery.validator.methods.date = function(value,element){if(value){try {$ .datepicker.parseDate('dd/mm/yy',value ); } catch(ex){return false; 返回true; }; (7认同)

Cht*_*lek 8

Rowan Freeman解决方案.toLocaleDateString(value)不适合我,因为不解析value字符串

这里是我想出的解决方案=>在jquery.validate.js中找到这个函数定义:"date:function(value,element)"并用以下代码替换代码:

// http://docs.jquery.com/Plugins/Validation/Methods/date
date: function (value, element) {
    var d = value.split("/");
    return this.optional(element) || !/Invalid|NaN/.test(new Date((/chrom(e|ium)/.test(navigator.userAgent.toLowerCase())) ? d[1] + "/" + d[0] + "/" + d[2] : value));
},
Run Code Online (Sandbox Code Playgroud)

  • 你可以修改它而不改变jquery本身,覆盖默认行为:`jQuery.validator.addMethod('date',function(value,element,params){if(this.optional(element)){return true;} ; return/^\d {4} [\ /\ - ]\d {1,2} [\ /\ - ]\d {1,2}\d {2}:\ d {1,2}:\ d {1,2} $/.test(value);},'');` (10认同)
  • 很好的抓住.对我来说同样的问题,这一个正在发挥作用! (2认同)

小智 7

下面是工作代码,可能有助于某人修复chrome和safari中的日期选择器问题:模型:

public DateTime? StartDate { get; set; }
Run Code Online (Sandbox Code Playgroud)

视图:

@Html.TextBoxFor(model => model.StartDate, "{0:dd/MM/yyyy}", new { @type = "text", @class = "fromDate" })
Run Code Online (Sandbox Code Playgroud)

JS:

$(function () {
    checkSupportForInputTypeDate();

    $('#StartDate').datepicker({        
        changeMonth: true,
        changeYear: true,
        dateFormat: 'dd/mm/yy'
    });    
});

//Function to configure date format as the native date type from chrome and safari browsers is clashed with jQuery ui date picker.
function checkSupportForInputTypeDate() {
    jQuery.validator.methods.date = function (value, element) {
        var isChrome = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);
        var isSafari = /Safari/.test(navigator.userAgent) && /Apple Computer/.test(navigator.vendor);
        if (isSafari || isChrome) {
            var d = new Date();
            return this.optional(element) || !/Invalid|NaN/.test(new Date(d.toLocaleDateString(value)));
        } else {
            return this.optional(element) || !/Invalid|NaN/.test(new Date(value));
        }
    };
}
Run Code Online (Sandbox Code Playgroud)


Kyl*_*Mit 7

以下是Maxim Gershkovich的解决方案:

jQuery.validator.methods.date = function (value, element) {
    if (value) {
        try {
            $.datepicker.parseDate('dd/mm/yy', value);
        } catch (ex) {
            return false;
        }
    }
    return true;
};
Run Code Online (Sandbox Code Playgroud)

备注:

  • 这取决于jQuery UI附带的jQuery datepicker方法
  • 这实际上比jQueryValidate附带的本机日期验证更强大.

    根据日期验证文档:

    如果值是有效日期,则返回true.使用JavaScript的内置日期来测试日期是否有效,因此不进行完整性检查.只有格式必须有效,而不是实际日期,例如30/30/2008是有效日期.

    然而,parseDate将检查日期是否有效并且实际存在.


归档时间:

查看次数:

38150 次

最近记录:

9 年,7 月 前