简单的答案是不要使用自定义日期格式。始终明确地使用 .Format("MM/dd/yyyy"),不要使用“dd/MM/yyyy”(“yyyy-MM-dd”或“MMM d, yyyy”可能可以)。并在控制面板或 Web.config 中将您的 Web 服务器设置为使用美国区域设置。
现在解释一下问题以及如何实际使 dd/MM/yyyy 工作:
Kendo 日期验证使用默认的 kendo culture 日期格式 kendo.culture().calendar.patterns.d(和 .t 用于时间)。如果直接设置此格式或应用不同的 culture,则设置正在进行验证的日期格式。它使用 kendo.parseDate,因此诸如“MMM d, yyyy”之类的东西就没问题了,但是如果 d > 12 并且使用默认的美国 culture(请参见 kendo 全球化演示以了解如何切换文化)则“dd/MM/yyyy”将无法通过验证。
发生这种情况的原因是 DatePicker.Format(...) 稍微有些错误。这是 kendo.aspnetmvc.js 中的一个 bug,它提供了一种替代的日期验证函数,该函数忽略 DatePicker 格式,并仅使用当前 culture 日期格式运行 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 服务器时再次出现错误(kendo 在 Firefox 下的默认文化是 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。
注意:非网格 DatePicker 似乎没有验证,因为缺少 "data-val-date" 属性。
另外:"记住,KendoUI首先使用parseFormats选项来解析日期,然后将其转换为format选项,并最后运行验证。这就是为什么我在验证中使用yyyy-MM-dd而不是["MM/dd/yyyy", "dd/MM/yyyy"]的原因。" - 如何使用kendo验证器验证日期格式为yyyy-MM-dd?
Web.config的全球化配置行:
<globalization requestEncoding="utf-8" responseEncoding="utf-8" culture="en-US" uiCulture="en-US" />