使用DatePicker

时间:2017-05-26 15:36:56

标签: asp.net-mvc kendo-ui kendo-grid kendo-asp.net-mvc

我在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...

对不起,如果这是一个剑道新手问题;我对剑道的东西很新。

1 个答案:

答案 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