Kendo删除按钮功能异常:未调用Transport的Destroy接口且报错
Kendo Grid 删除行但不触发Destroy API + 类型错误的解决方案
先帮你梳理下问题核心:点击删除确认后前端行消失了,但没调用Transport里的Destroy接口,还抛出了Cannot convert undefined or null to object的类型错误,这大概率是Kendo Grid无法正确识别要删除的数据记录导致的,下面给你分步排查和解决的方案:
最常见原因:未配置DataSource的Model唯一ID
Kendo Grid必须知道每条数据的唯一标识,才能生成正确的Destroy请求并处理行删除逻辑。如果缺失这个配置,就会出现前端删行但不发请求,还触发内部类型错误的情况。
修复代码示例:
// 正确配置DataSource的schema.model.id var myDataSource = new kendo.data.DataSource({ transport: { read: "/your-api/read", destroy: "/your-api/destroy" // 确保接口路径正确 }, schema: { model: { id: "recordId", // 替换成你数据中实际的唯一字段,比如userId、id fields: { // 其他字段配置,比如name: { type: "string" } } } } });
确保id指向的数据字段存在且不为空/undefined,这是Kendo识别数据的核心标识。
自定义删除逻辑的坑:错误操作DOM而非数据项
如果你自己写了删除按钮的点击事件,很可能是直接操作了表格行,而没有先获取对应的数据项,导致Kendo内部找不到要同步的数据对象。
错误示例(会导致问题):
$(".custom-delete-btn").click(function() { let grid = $("#grid").data("kendoGrid"); let row = $(this).closest("tr"); grid.removeRow(row); // 直接删行,但没告诉DataSource要删哪条数据 });
正确的自定义删除逻辑:
先获取对应的数据项,再通过DataSource删除并同步:
$(".custom-delete-btn").click(function() { let grid = $("#grid").data("kendoGrid"); let dataItem = grid.dataItem($(this).closest("tr")); if (dataItem && confirm("确定要删除这条记录吗?")) { grid.dataSource.remove(dataItem); // 先通知DataSource删除数据 grid.dataSource.sync(); // 手动触发同步,确保Destroy请求发送 } });
简化测试:先使用Kendo内置删除命令
如果自定义逻辑太复杂,建议先放弃自定义,用Grid内置的删除命令验证是否正常:
$("#grid").kendoGrid({ columns: [ // 其他列配置 { command: "destroy", text: "删除" }, // 内置删除命令,自动处理确认框+请求 ], editable: "popup", // 或inline,必须开启编辑模式 dataSource: myDataSource });
用内置命令测试如果正常,就说明问题出在你的自定义逻辑上;如果还是有问题,就回到第一步检查DataSource的ID配置。
最后验证步骤
- 打开浏览器控制台的Network标签,点击删除后观察是否有Destroy请求发送;
- 检查数据中的唯一ID字段,确保每条数据的ID都不为空/undefined;
- 暂时移除所有自定义的删除事件,先让内置功能跑通,再逐步添加自定义逻辑。
内容的提问来源于stack exchange,提问作者user2849331
相关产品推荐
相关产品推荐

