我在Windows MVC中使用了Kendo。我有一个带有几个不同列的Kendo Grid。其中一些列包含日期。所有这些列都可以根据几个不同的标准进行过滤(等于,不等于,之前是等等)。当用户选择过滤其中任何一列时,在过滤条件窗口中,他们应该能够使用Kendo DatePicker小部件。
这就是问题所在。我们所有的日期都表示为字符串,而不是DateTimes。原因很简单:当显示DateTime对象时,.NET和/或Kendo将DateTimes转换为显示它们的浏览器的本地时间。我们不能允许这样做。我们需要在我们提供时准确呈现日期。
当列表示DateTime时,默认情况下DatePicker可用。所以问题是,当列显示字符串时,如何让过滤器窗口显示DatePicker?
我认为必须在剃须刀中做一些特殊的事情。剃刀字段绑定到模型中的属性。相关的剃刀看起来像这样:
@(Html.Kendo().Grid<JobsAcrossWorld>()
.Name("JobsAcrossWorld")
.Columns(c =>
{
c.Bound(m => m.ScheduleDate); // this is a DateTime as a string
c.Bound(m => m.GeoArea);
c.Bound(m => m.Begin); // this is a DateTime as a string
c.Bound(m => m.End); // this is a DateTime as a string
c.Bound(m => m.Effort);
})
.Pageable(p => p.
Enabled(true)
...many more options...
对不起,如果这是一个剑道新手问题;我对剑道的东西很新。
答案 0 :(得分:1)
如果你想比较日期,你需要在JavaScript中使用解析字符串到Date对象。否则比较操作将无效。
本地时间不是这里的论点,这可能会导致时区出现问题。
要以UTC时间显示日期,请在C#中将日期转换为UTC种类:
DateTime dt = DateTime.Now;
DateTime ut = DateTime.SpecifyKind(dt, DateTimeKind.Utc);
然后在dataSource requestEnd事件中为所有日期字段设置正确的时区:
field = field.replace(/\d+/, function (n) {
var offsetMiliseconds = new Date(parseInt(n)).getTimezoneOffset() * 60000;
return parseInt(n) + offsetMiliseconds;
});
来源:http://docs.telerik.com/aspnet-mvc/helpers/grid/how-to/editing/utc-time-on-both-server-and-client
<强>替代强>
如果你不想使用这个解决方案,你还有两个选择,但更难:
过滤器正在处理分配给列的属性,但您可以使用.Template("#= FieldName#")
分配一个属性并显示其他属性。因此,您可以显示您的字符串并具有第二个属性,其中日期已分配给列,但您需要在该属性中再次使用正确的日期,否则过滤器将出错。
您可以编写自己的过滤器来处理字符串(可能会再次在日期解析它们),如下例所示:http://demos.telerik.com/kendo-ui/grid/filter-menu-customization