Telerik Kendo UI ASP.NET MVC Grid - 已保存数据项的事件处理

Posted

技术标签:

【中文标题】Telerik Kendo UI ASP.NET MVC Grid - 已保存数据项的事件处理【英文标题】:Telerik Kendo UI ASP.NET MVC Grid - Event handling of Saved Data Item 【发布时间】:2019-05-02 19:52:27 【问题描述】:

我正在使用带有网格控件的 ASP.NET MVC Kendo 库,使用 GridEditMode.PopUp 模式进行添加/编辑。我有 20 多个使用该控件的屏幕,我允许对其进行创建和更新操作。大多数模型都有日期范围、开始和结束日期,它们是 EntityFramework 中的 DateTime 对象。

简而言之:

如何在保存后立即从服务器刷新已添加/已编辑的记录?这个问题独立于我下面描述的实际问题的细节。我希望保存的记录转到服务器,然后从服务器“读取”回来,以便加载网格时通常触发的所有事件都应用于这一记录。

我的创建/更新事件进行数据库保存,然后简单地说:return Json(new[] myModelObject .ToDataSourceResult(request, ModelState));

我试过了:

onSync - 认为它会触发网格刷新,以便新的 记录是从服务器中提取的。

从技术上解决问题。新记录的日期与原来一样 进入。不好,因为您必须等待网格刷新,然后您就输了 新/编辑记录的位置(它被排序到任何位置 属于)。

更糟糕的是:如果在服务器上添加了 ModelState 错误,这 以某种方式绕过了所有这些。会发生什么是响应来了 返回,显示天桥错误,但触发了同步(我假设 因为Client Validation成功了,不知道怎么看 ModelState 错误)。同步触发网格刷新。网格 刷新关闭添加弹出窗口。所以,用户看到了窗口 消失。

AutoSync(true) - 在 Grid 对象上找到它并认为它听起来不错 喜欢解决方案。我认为它会在保存记录时同步。 但是,只需单击“添加”,它就会触发我的创建操作 按钮首先加载弹出窗口。意外 行为并且想不出一个用例

我想知道如何做到这一点,即使我在下面尝试解决的问题可以通过其他方式规避。我认为应该有一种方法可以访问 Saved dataItem,并且我认为我将来需要这样做。

特别是为什么我首先要这样做:

我希望在添加/编辑对话框中输入任何日期以完全忽略时间的概念。如果我在东部时间并输入 12/01/2018,那么“12/01/2018 00:00:00”就是我想要发布的内容。如果用户在太平洋时间打开此记录,他们会看到“12/01/2018 00:00:00”。我不想将所有内容都转换为字符串,因为这感觉像是不好的做法,然后在 Kendo 中进行排序/过滤将无法正常工作(我假设)。

背景:我的问题是在添加或编辑时,网格中的日期偏移到机器的本地时区。因此,您可以添加一条新记录,在 DatePicker 中输入 12/01/2018(没有时间可用),然后在 Grid 中,第一行显示 11/30/2018。使用控制台并查看对象,我看到 [date] Thu Nov 30 2018 23:00:00 GMT-0600(中部标准时间)。然而,控制器收到 12/01/18 00:00:00(这是正确的)。

我已经用 Reads 解决了这个问题,因为最初我网格中的 EVERY 记录被偏移(用户注意到每个日期都比数据库中的实际日期早 1 天)。我发现一些文章表明使用 requestEnd 事件循环值,对于“/Date(”字符串,将数值替换为 kendo.timezone.apply(new Date(parseInt(n)), "Etc/UTC").getTime(); 。这很好用……当网格从服务器刷新时。我可以拥有 EntityFramework在所有 DateTime 对象上将 DateTime.Kind 设置为 UTC,然后 kendo 将所有本地 Date 对象偏移为 UTC 日期对象。在正确的日期将其恢复到午夜。

但是,添加/编辑不会从服务器刷新。所以添加/编辑时不会发生 EF 事件和 Kendo requestEnd 事件。似乎 Kendo 将数据发布到服务器,然后说“我已经知道这些值,所以我将直接从表单输入字段复制到网格”。高效,但它绕过了我的偏移逻辑。

这是一个模型属性的示例:

[Column(Order = 10, TypeName = "smalldatetime")]
[UIHint("Date")]
[DisplayFormat(DataFormatString = "0:MM/dd/yyyy", ApplyFormatInEditMode = true)]
[DisplayName("Start Date")]
public DateTime startDate  get; set; 

【问题讨论】:

【参考方案1】:

更新后是否返回空对象?:

return Json(new[]  myModelObject .ToDataSourceResult(request, ModelState));. 

而不是返回更新的对象(telerik 将更新本地数据并希望自动修复问题?)。

return Json(service.Read(updatedId).ToDataSourceResult(request, ModelState));

我通常不会返回更新后的对象,因为我想获得与正常读取相同的“修复”...当您返回一个对象时,我猜 Telerik 将运行 requestEnd 并修复日期在更新的记录上?

【讨论】:

以上是关于Telerik Kendo UI ASP.NET MVC Grid - 已保存数据项的事件处理的主要内容,如果未能解决你的问题,请参考以下文章

使用 Kendo UI Asp.net mvc core 未显示图表组件

ASP.NET MVC、Telerik Kendo、jQuery 验证中的非标准日期格式

你好 我想问你下 你使用的telerik 的kendo for ASP.NET MVC是收费的吗

发布时未调用具有 Telerik Kendo Grid Read 方法 ([DataSourceRequest]) 的 ASP.NET Core 2.0

kendo ui - core

Kendo UI Web 和 Kendo UI ASP.NET for MVC 之间的区别