Kendo 使用 DatePicker 的网格列过滤器

Kendo Grid Column Filter with DatePicker

我正在使用 Kendo 和 ASP.NET MVC。我有一个包含多个不同列的 Kendo 网格。其中一些列包含日期。所有这些列都可以根据几个不同的标准进行过滤(等于、不等于、早于等)。当用户选择过滤任何这些列时,在过滤条件 window 中,他们应该能够使用 Kendo DatePicker 小部件。

这是要点。我们所有的日期都表示为字符串,而不是日期时间。原因很简单:当显示 DateTime 对象时,.NET and/or Kendo 将 DateTimes 转换为显示它们的浏览器的本地时间。我们不能允许这样。我们需要准确呈现我们提供的日期。

当一列表示日期时间时,DatePicker 默认可用。所以问题是,如何让过滤器 window 在列显示字符串时显示 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...

抱歉,如果这是 Kendo 新手问题;我在 Kendo 方面还很陌生。

如果要比较日期,无论如何都需要将字符串解析为 JavaScript 中的日期对象。否则比较操作将不起作用。

当地时间不是这里的参数,它是时区可能有问题的借口。

要以 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