Kendo DatePicker无法验证自定义日期格式

时间:2012-07-24 06:23:00

标签: telerik asp.net-mvc-4 kendo-ui

我正在使用Kendo DatePicker来编辑我的ASP.NET MVC 4项目中的Kendo Grid中显示的Date字段。为了将DatePicker用于Date字段,请使用自定义日期格式字符串,我将Date.cshtml文件夹下的EditorTemplates文件更新为以下内容:

@(Html.Kendo().DatePickerFor(m => m).Format("dd/MM/yyyy"))

通过这样做,我设法让DatePicker显示我想要的格式。但是,它无法通过手动键入或从弹出日历中选择输入的输入日期验证。

经过进一步调查,我可以说DatePicker正在根据M/d/Y格式验证日期。这个假设是基于我的创立12/12/2012是一个有效的日期,而13/1/2012不是。

我还尝试将.ParseFormat("dd/MM/yyyy")添加到Date.cshtml中DatePicker声明的末尾,但它没有修复任何内容。所以我想说这绝对是一个错误,我稍后会向Telerik报告。

但就目前而言,我正在寻找一种解决方法来实现这一目标。我发现我可以在Javascript中覆盖kendo.ui.validator.rules.mvcdate以拥有自己的验证功能。虽然这在Chrome中运行良好,但在IE9中无效。

那么,任何想法如何让DatePicker接受dd/MM/yyyy输入格式?提前谢谢。

6 个答案:

答案 0 :(得分:12)

在内部,ASP.NET MVC的日期验证规则(不显眼的客户端验证)使用kendo.parseDate(string)方法,如果没有定义格式/,则内部将使用the predefined date patterns。我想在你的情况下,默认文化是" en-US"这就是验证失败的原因,因为日期为" dd / MM / yyyy"格式被视为无效。一种可能的解决方案是覆盖日期验证规则(就像您一样)并使用特定格式解析字符串。另一个选项是为页面设置差异文化设置。 For instance, the short date format for the "de-DE" culture is "dd/MM/yyyy".

答案 1 :(得分:10)

我使用这种方法,它工作正常..

在页面中添加这两行..

<script src="@Url.Content("~/Scripts/jquery.validate.js")"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")"></script>

然后覆盖jQuery日期验证方法..

<script>
    $(document).ready(function () {
        kendo.culture("en-MY"); //your culture
        $.validator.addMethod('date',
           function (value, element) {
               return this.optional(element) || kendo.parseDate(value)
           });
    });
</script>

同时在我Web.config我有这个......

<system.web>
    <globalization uiCulture="en-MY" culture="en-MY"></globalization>
</system.web>

答案 2 :(得分:4)

  [DataType(DataType.Date)]
  [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
  [Required(ErrorMessage = "Pick a date from Kendo Date Picker")]
   public DateTime mydate{ get; set; }

    @(Html.Kendo().DatePickerFor(m=>m.mydate)
                .Name("MyDate")
                .Format("dd/MM/yyyy")
                 .ParseFormats(new string[] {"dd/MM/yyyy"}))

/ 添加脚本document.ready function /

     $(document).ready(function () { kendo.culture("en-GB");

         $.validator.methods['date'] = function (value, element) {
    var check = false;
    var re = /^\d{1,2}\/\d{1,2}\/\d{4}$/;
    if (re.test(value)) {

        var adata = value.split('/');
        var dd = parseInt(adata[0], 10);

        var mm = parseInt(adata[1], 10);
        var yyyy = parseInt(adata[2], 10);
        var xdata = new Date(yyyy, (mm - 1), dd);

        if ((xdata.getFullYear() == yyyy) && (xdata.getMonth() == (mm - 1)) && 
            (xdata.getDate() == dd)) {

            check = true;
        }
        else {
            alert(value);
            check = false;
        }

    } else
        check = false;
    return this.optional(element) || check;
}

});

答案 3 :(得分:1)

我更改了日期验证规则:

$.validator.methods.date = function (value, element) {
    return this.optional(element) || /^\d\d?-\w\w\w-\d\d\d\d/.test(value);
};

我的格式与您的格式略有不同,但您应该可以修改此格式。

答案 4 :(得分:1)

使用甘特图组件here时遇到了同样的问题。 Telerik的支持让我指的是here

我的重要遗漏是我没有在_Layout.vbhtml文件中包含以下内容:

<script>
kendo.culture("en-GB");
</script>

一旦包含(与我的JS包中相应的kendo.culture脚本一起),帮助程序就会按预期运行。

答案 5 :(得分:0)

简单的答案是不要使用自定义日期格式。只是总是明确地做.Format(“MM / dd / yyyy”)并且不要使用“dd / MM / yyyy”(“yyyy-MM-dd”或“MMM d,yyyy”可能没问题)。并将您的Web服务器设置为在控制面板或Web.config中使用美国区域设置。

现在解释问题以及如何实际让dd / MM / yyyy工作:

剑道日期验证使用默认的剑道文化日期格式kendo.culture()。calendar.patterns.d(和.t表示时间)。如果直接设置或应用其他文化,则设置要验证的日期格式。它使用kendo.parseDate,所以像“MMM d,yyyy”这样的东西会很好,但是像“dd / MM / yyyy”这样的东西将失败验证,如果d&gt; 12正在使用默认的美国文化(参见关于如何转换文化的kendo全球化演示)。

发生这种情况的原因是因为DatePicker.Format(...)稍有破坏。这是kendo.aspnetmvc.js中的一个错误,它提供了一个替代日期验证功能,它忽略了DatePicker格式,并使用当前的文化日期格式运行parseDate。这是固定的javascript:

    date: function(input) {
        var dp = input.data("kendoDatePicker") || input.data("kendoDateTimePicker");
        if (dp != undefined) {
            return input.val() === "" || kendo.parseDate(input.val(), dp.options.format) !== null;
        }

        return input.val() === "" || kendo.parseDate(input.val()) !== null;
    },

此外,kendo.validator.js / kendo.web.js中的日期验证程序功能存在一个小错误,它使得Internet Explorer中网格的日期验证始终失败。

此外,请确保将您的Web服务器全球化设置为美国以匹配kendo文化(在Web.config或Windows区域控制面板中)。 Firefox发布MM / dd / yyyy并且Web服务器需要匹配它。此外,如果未明确指定DatePicker.Format,则Web服务器区域日期格式将应用于所有客户端浏览器。因此,如果您的Web服务器在Windows的控制面板中设置了加拿大/英国日期格式,则kendo网格DatePickers默认为dd / MM / yyyy然后验证错误,并且当firefox发布到Web服务器时再次出现(在firefox帖子下的kendo默认文化) MM / dd / yyyy所以如果您的Web服务器需要dd / MM / yyyy,则mvc日期绑定失败)。

注意:如果您更喜欢使用非mvc日期验证器:删除data-val-date属性。添加:data-type = \“date \”data-format = \“dd / MM / yyyy h:mm:ss tt \”。我相信使用html帮助器是不可能的。你必须直接指定html和javascript。

注意:由于缺少“data-val-date”属性,非网格DatePickers似乎没有验证。

另外:“请记住,KendoUI首先使用parseFormats选项来解析日期,然后将其转换为格式选项,最后运行验证。这就是我在验证中使用yyyy-MM-dd而不是[”MM / dd / yyyy “,”dd / MM / yyyy“]。” - How to validate a date is in the format yyyy-MM-dd using kendo validator?

Web.config全球化专线:

<globalization requestEncoding="utf-8" responseEncoding="utf-8" culture="en-US" uiCulture="en-US" />