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

Kendo UI Grid内联编辑时如何批量提交所有变更行至服务器?

如何让Kendo UI Grid一次性提交所有变更行/全部行数据

当然可以实现一次性提交所有变更数据或者网格全部行的需求,默认的内联编辑确实会每行触发一次Update,但我们可以通过自定义保存逻辑来实现批量提交。下面是具体的实现步骤:

1. 修改Grid配置

首先调整Grid的DataSource配置,移除默认的Update绑定,同时给保存按钮添加ID方便绑定自定义事件。修改后的Grid代码如下:

@(Html.Kendo().Grid<StrategyParameterModel>()
    .Name("strategyParameters")
    .Columns(columns => {
        columns.Bound(c => c.Id).Width(170);
        columns.ForeignKey(p => p.ParamType, (System.Collections.IEnumerable)ViewData["paramTypes"], "Key", "Value").Title("Param Type").Width(200);
        columns.Bound(c => c.Key);
        columns.Bound(c => c.Value);
        columns.Bound(c => c.MinimumValue);
        columns.Bound(c => c.MaximumValue);
        columns.Bound(c => c.IncrementalValue);
    })
    .ToolBar(toolbar => {
        toolbar.Create();
        toolbar.Save().HtmlAttributes(new { id = "batchSaveBtn" }); // 给保存按钮添加ID
    })
    .Editable(editable => editable.Mode(GridEditMode.InCell))
    .Pageable(pager => pager.Refresh(true) )
    .Navigatable()
    .Resizable(resize => resize.Columns(true))
    .Sortable(sortable => {
        sortable.SortMode(GridSortMode.SingleColumn);
        sortable.AllowUnsort(false);
    })
    .Filterable(filterable => filterable.Mode(GridFilterMode.Menu))
    .Scrollable()
    .DataSource(dataSource => dataSource
        .Ajax()
        .PageSize(100)
        .Model(model => {
            model.Id(p => p.Id);
            model.Field(p => p.Id).Editable(false);
        })
        .Read(read => read.Action("StrategyParameter_Read", "StrategySets").Data("getStrategySetId"))
        // 移除默认的Update配置,改用自定义提交逻辑
        .Sort(sort => sort.Add("Id").Descending())
    )
    .Deferred()
)

2. 编写自定义保存的JavaScript逻辑

绑定保存按钮的点击事件,收集变更数据(或全部数据)后一次性提交到服务器:

$(document).ready(function() {
    $("#batchSaveBtn").on("click", function(e) {
        e.preventDefault(); // 阻止默认单行提交行为
        var grid = $("#strategyParameters").data("kendoGrid");
        var dataSource = grid.dataSource;
        
        // 方式1:获取所有已变更的行(新增、修改、删除)
        var changes = dataSource.getChanges();
        // 可单独获取不同类型的变更:
        // var addedRows = dataSource.added();
        // var updatedRows = dataSource.dirty();
        // var deletedRows = dataSource.deleted();
        
        // 方式2:获取网格中的全部行数据
        // var allRows = dataSource.data().toJSON();
        
        // 先判断是否有需要保存的变更
        if (changes.added.length === 0 && changes.dirty.length === 0 && changes.deleted.length === 0) {
            alert("没有需要保存的变更数据");
            return;
        }
        
        // 准备提交的数据,包含你需要的strategySetId
        var postData = {
            strategySetId: getStrategySetId(), // 调用原有获取ID的方法
            changes: changes // 如果用全部行则传allRows
        };
        
        // 发送批量提交请求
        $.ajax({
            url: "@Url.Action("StrategyParameter_BatchUpdate", "StrategySets")",
            type: "POST",
            contentType: "application/json",
            data: JSON.stringify(postData),
            success: function(result) {
                // 提交成功后清除变更标记并刷新网格
                dataSource.sync();
                grid.refresh();
                alert("批量保存成功");
            },
            error: function(xhr, status, error) {
                alert("保存失败:" + error);
            }
        });
    });
});

3. 修改后端Controller的Action

在StrategySets控制器中添加批量处理的Action,接收变更数据列表:

// 定义接收变更数据的模型
public class BatchChangesModel
{
    public List<StrategyParameterModel> Added { get; set; }
    public List<StrategyParameterModel> Dirty { get; set; }
    public List<StrategyParameterModel> Deleted { get; set; }
}

// 批量处理Action
public ActionResult StrategyParameter_BatchUpdate(int? strategySetId, [FromBody]BatchChangesModel changes)
{
    // 在这里处理不同类型的变更:新增/修改/删除
    // 示例:遍历修改的行进行保存
    foreach(var updatedParam in changes.Dirty)
    {
        // 你的业务逻辑:更新数据库等
    }
    
    // 返回处理结果
    return Json(new { success = true });
}

如果需要提交全部行数据,Action可以改为接收列表:

public ActionResult StrategyParameter_BatchUpdate(int? strategySetId, [FromBody]List<StrategyParameterModel> allParameters)
{
    // 处理全部行的保存逻辑
    return Json(new { success = true });
}

关键说明

  • dataSource.getChanges():会返回包含三类变更的对象,精准获取需要提交的数据,避免不必要的传输。
  • dataSource.sync():提交成功后调用该方法,清除数据源的变更标记,让网格回到“干净”状态。
  • 必须阻止保存按钮的默认行为,否则会触发原有单行提交逻辑,导致冲突。

内容的提问来源于stack exchange,提问作者Jean-François Beaulieu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:29:48