You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:06:23