Kendo Grid特定列编辑后数据未更新,请求排查问题
看起来你遇到的问题很典型:在Kendo Grid里修改了ITEM_VALUE,但点击“发送流”按钮生成文件时,用的还是数据库里的原始值,完全没用到你修改后的内容。核心原因很简单——你在客户端做的修改只停留在浏览器内存里,完全没同步到服务器,而你的控制器方法又直接从数据库重新拉数据,自然拿不到新值。
咱们一步步来解决这个问题,分两种场景给你方案:
场景1:需要把修改永久保存到数据库,再生成文件
这种场景下,咱们要先让Grid把修改提交到服务器保存,再执行发送逻辑。
第一步:给Grid配置Update操作,让修改能提交到服务器
在你的Grid DataSource配置里,加上Update的Action路由,告诉Kendo哪里处理更新请求:
.DataSource(datasource => datasource.Ajax() .Model(model => { model.Id(p => p.ITEM_ID); model.Field(p => p.ITEM_ID).Editable(false); model.Field(p => p.GROUP_ID).Editable(false); model.Field(p => p.GROUP_NAME).Editable(false); model.Field(p => p.ITEM_NAME).Editable(false); model.Field(p => p.ITEM_VALUE).Editable(true); }) // 新增这一行,指定更新的控制器方法 .Update(update => update.Action("UpdateResendItem", "YourController")) )
第二步:在控制器里写处理更新的方法
这个方法负责接收Grid传递的修改后数据,更新到数据库:
[HttpPost] public ActionResult UpdateResendItem([DataSourceRequest] DataSourceRequest request, ResendFlow resendItem) { if (resendItem != null && ModelState.IsValid) { // 找到数据库里对应的记录 var dbItem = _repository.Context.ResendFlows.FirstOrDefault(p => p.ITEM_ID == resendItem.ITEM_ID); if (dbItem != null) { // 更新ITEM_VALUE dbItem.ITEM_VALUE = resendItem.ITEM_VALUE; _repository.Context.SaveChanges(); } } return Json(new[] { resendItem }.ToDataSourceResult(request, ModelState)); }
第三步:点击发送按钮前先保存Grid的修改
在前端按钮的点击事件里,先调用Grid的saveChanges方法提交修改,再触发发送请求:
$("#sendFlowBtn").click(function() { var grid = $("#ResendFlowGride").data("kendoGrid"); // 先把所有修改提交到服务器保存 grid.saveChanges(); // 这里再写发送请求到SendResendFile方法的逻辑 // 比如用$.ajax发送请求... });
这样一来,当你点击发送时,修改已经保存到数据库了,后续执行存储过程就能拿到新值。
场景2:不需要永久保存,只是本次发送用修改后的值
如果你的修改只是临时的,不需要存到数据库,那可以直接把客户端Grid的当前数据传递给控制器,用这些数据来生成文件。
第一步:前端收集Grid的当前数据并传递
修改发送按钮的点击事件,把Grid里的所有数据(包含修改后的值)转成JSON字符串传给控制器:
$("#sendFlowBtn").click(function() { var grid = $("#ResendFlowGride").data("kendoGrid"); // 获取Grid当前的所有数据(已包含修改) var updatedData = grid.dataSource.data(); // 转成JSON字符串方便传递 var jsonData = JSON.stringify(updatedData); // 发送AJAX请求到控制器 $.ajax({ url: "@Url.Action("SendResendFile", "YourController")", type: "POST", data: { Flow_Id: yourFlowId, // 替换成你的实际变量 RegID: yourRegID, ResendId: yourResendId, Condition: yourCondition, GroupWhere: yourGroupWhere, UpdatedResendData: jsonData // 传递修改后的数据 }, success: function(response) { // 处理成功回调 } }); });
第二步:控制器接收并使用修改后的数据
修改你的SendResendFile方法,先解析前端传来的修改后数据,要么用这些数据直接处理,要么先临时更新数据库再执行存储过程:
using Newtonsoft.Json; // 需要引用Newtonsoft.Json包 public ActionResult SendResendFile(int Flow_Id, int RegID, int ResendId, string Condition, string GroupWhere, string UpdatedResendData) { RegistrationHeaderDetails RegHD = new RegistrationHeaderDetails(); string strMsg = string.Empty; // 解析前端传来的修改后数据 List<ResendFlow> updatedResendList = JsonConvert.DeserializeObject<List<ResendFlow>>(UpdatedResendData); using (TransactionScope transaction = new TransactionScope()) { try { // 可选:如果存储过程需要从数据库读数据,先临时更新数据库 foreach(var item in updatedResendList) { var dbItem = _repository.Context.ResendFlows.FirstOrDefault(p => p.ITEM_ID == item.ITEM_ID); if(dbItem != null) { dbItem.ITEM_VALUE = item.ITEM_VALUE; } } _repository.Context.SaveChanges(); // 执行存储过程,现在就能拿到修改后的值了 _repository.Context.Database.ExecuteSqlCommand( "exec PROC_SEND_RESEND_FILE {0},{1},{2},{3},{4},{5}", RegID, Flow_Id, Convert.ToInt32(Session["userid"]), ResendId, GroupWhere, Condition ); // 后续查询可以直接用updatedResendList,不用再从数据库拉 RegHD.lstResend = updatedResendList; // 其他原有查询逻辑... IEnumerable<ResendFlowDetail> IResendFlowDetail = _repository.Context.Database.SqlQuery<ResendFlowDetail>( "PROC_GET_RESEND_FLOW @REG_ID = {0} ", RegID ).ToList().AsQueryable(); RegHD.lstResendFlowDetail = IResendFlowDetail.ToList(); IEnumerable<DataFlow> DataflowDetails = _repository.Context.Database.SqlQuery<DataFlow>( "PROC_GET_FILES_DATAFLOW @RegistrationId = {0}", RegID ).ToList().AsQueryable(); RegHD.DataFlow = DataflowDetails.ToList(); transaction.Complete(); strMsg = Flow_Id == 1 ? "Flow D0055 Send Successfully" : "File Send Successfully"; } catch(Exception ex) { transaction.Dispose(); strMsg = $"Error: {ex.Message}"; } } return Json(new { Message = strMsg, Data = RegHD }); }
关键提醒
你之前的代码里,执行完存储过程后又重新从数据库查询数据,但数据库根本没被修改过,所以拿到的还是旧值。不管用哪种方案,核心都是要让服务器端能获取到客户端的修改内容——要么提前保存到数据库,要么直接传递修改后的数据。
内容的提问来源于stack exchange,提问作者chetan kambli

