繁体   English   中英

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

[英]Telerik Kendo UI ASP.NET MVC Grid - Event handling of Saved Data Item

我正在将带有网格控件的ASP.NET MVC Kendo库与GridEditMode.PopUp模式一起用于添加/编辑。 我有20多个使用该控件的屏幕,我可以在其中使用“创建”和“更新”操作。 大多数模型都有日期范围,开始日期和结束日期是EntityFramework中的DateTime对象。

简而言之的问题:

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

我的Create / Update事件保存数据库,然后简单地: return Json(new[] { myModelObject }.ToDataSourceResult(request, ModelState));

我努力了:

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

    • 从技术上解决问题。 新记录具有输入的日期。 不好,因为您必须等待网格刷新,并且丢失了新记录/已编辑记录的位置(该记录将按照其所属位置进行排序)。

    • 更糟糕的是:如果在服务器上添加了ModelState错误,这将以某种方式绕过所有这些。 发生的情况是响应返回,显示了跨接错误,但是触发了同步(我认为是因为客户端验证成功,并且它不知道如何查看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(无时间可用),然后在网格中,第一行显示11/30/2018。 使用控制台并查看对象,我看到[date] 2018年11月30日星期四GMT-0600(中部标准时间) 但是,控制器会收到12/01/18 00:00:00 (正确)。

我已经用读取解决了这个问题,因为最初网格中的每个记录都被抵消了(用户注意到每个日期都比数据库中的实际日期早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似乎将数据发布到服务器,然后说:“我已经知道这些值,因此我将直接从表单输入字段复制到网格中”。 高效,但是它绕过了我的偏移逻辑。

这是Model属性的示例:

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

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

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

而不是返回更新的对象(该telerik将使用来更新本地数据并希望自动解决该问题?)。

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

我通常不返回更新后的对象,因为我想获得与普通读取相同的“修复” ...而当您返回对象时,我猜测telerik将运行requestEnd并在更新后确定日期记录?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM