7

打开 Kendo 网格批量编辑后,我知道您可以连接到创建、更新和销毁命令,当您单击 Save Changes 时,Kendo 将向服务器发送 3 个单独的命令。

我想知道是否有任何方法可以将所有三组更新作为单个调用发送到服务器 - 就像事务一样。或者甚至以指定的顺序发送每个,在发送下一个之前检查成功。

我能想出的唯一方法是有一个自定义的保存更改实现,当调用它时,它将查找网格数据源以找出所有已添加的行(isNew() 用于添加的行),删除(_destroyed 用于删除的行),更新(isDirty 用于更新的行),然后使用已识别的数据集使用 ajax 制作我自己对服务器端点的调用。

4

3 回答 3

13

Telerik 最近在他们的代码库中发布了一个解决方法:http ://www.kendoui.c​​om/code-library/mvc/grid/save-all-changes-with-one-request.aspx 。不幸的是,解决方法相当简单。它提供了一个很好的示例,说明了如何捕获已损坏、脏记录和新记录,但最后需要挥手处理响应中的任何错误,并在成功时同步数据源。另请注意,在发出 ajax 请求之前,没有检查以确保有销毁、脏记录或新记录。

这是相关的代码。从上面的链接下载完整示例,查看网格的设置方式并确保您拥有最新版本。

function sendData() {
    var grid = $("#Grid").data("kendoGrid"),
        parameterMap = grid.dataSource.transport.parameterMap;

    //get the new and the updated records
    var currentData = grid.dataSource.data();
    var updatedRecords = [];
    var newRecords = [];

    for (var i = 0; i < currentData.length; i++) {
        if (currentData[i].isNew()) {
            //this record is new
            newRecords.push(currentData[i].toJSON());
        } else if(currentData[i].dirty) {         
            updatedRecords.push(currentData[i].toJSON());
        }
    }

    //this records are deleted
    var deletedRecords = [];
    for (var i = 0; i < grid.dataSource._destroyed.length; i++) {
        deletedRecords.push(grid.dataSource._destroyed[i].toJSON());
    }

    var data = {};
    $.extend(data, parameterMap({ updated: updatedRecords }), parameterMap({ deleted: deletedRecords }), parameterMap({ new: newRecords }));

    $.ajax({
        url: "/Home/UpdateCreateDelete",
        data: data,
        type: "POST",
        error: function () {
            //Handle the server errors using the approach from the previous example
        },
        success: function () {
            alert("update on server is completed");

            grid.dataSource._destroyed = [];
            //refresh the grid - optional
            grid.dataSource.read();
        }
    })
}
于 2014-01-21T21:06:08.737 回答
2

也许您可以batch启用Datasource

批处理布尔值(默认值:false)

如果设置为 true,数据源将批处理 CRUD 操作请求。例如,更新两个数据项将导致一个 HTTP 请求而不是两个。默认情况下,数据源为每个 CRUD 操作发出 HTTP 请求。

来源:数据源 API

于 2013-06-11T09:15:54.787 回答
0

六年后我们有了答案,检查提交功能以执行单个请求以保存所有更改:https ://docs.telerik.com/kendo-ui/api/javascript/data/datasource/configuration/transport.submit

于 2020-03-05T15:39:32.810 回答