我正在使用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
输入格式?提前谢谢。
答案 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" />