Kendo Telerik MVC子网格绑定后无法更新InternVM模型求助
问题分析与解决方案
首先得明确问题出在哪:你用EditorTemplate实现的子网格是独立的Kendo Grid组件,它的增删改操作都是通过自己的DataSource单独提交请求的,并不会自动把修改后的数据同步到主网格绑定的InternVM.Schedules属性里。当你提交主网格的更新时,Kendo只会收集主网格列绑定的字段值,完全没把子网格的修改数据带上,所以后端的InternVM模型自然得不到更新后的Schedules数据。
下面给你两种可行的解决思路,选哪种看你业务场景:
方法1:主网格提交前同步子网格数据
在主网格执行保存操作的瞬间,手动把当前子网格的所有最新数据提取出来,赋值给主模型的Schedules字段,这样主网格的Update请求就会带上完整的最新数据。
具体步骤:
- 给主网格添加
Save事件监听:
@(Html.Kendo().Grid<InternVM>() // ... 其他配置 .Events(e => { e.BeforeEdit("onBeforeEdit"); e.Save("onMainGridSave"); // 新增这个事件绑定 }) )
- 编写
onMainGridSave函数:
function onMainGridSave(e) { // 获取子网格实例 const scheduleGrid = $("#InternScheduleGrid").data("kendoGrid"); if (!scheduleGrid) return; // 获取子网格的所有数据(转成JSON格式方便赋值) const latestSchedules = scheduleGrid.dataSource.data().toJSON(); // 把最新数据赋值给主模型的Schedules字段 e.model.set("Schedules", latestSchedules); }
这样,当你点击主网格的"更新"按钮时,会先同步子网格的最新数据到主模型,再提交请求,后端就能拿到完整的InternVM对象了。
方法2:子网格操作后实时同步主模型
另一种思路是,每当子网格完成增删改操作,就立刻把最新数据同步到当前编辑的主模型里,确保主模型始终和子网格数据保持一致。
修改子网格的onRequestEnd函数:
function onRequestEnd(e) { if (e.type == "update" || e.type == "create" || e.type == "remove") { // 重新加载子网格数据确保是最新的 const scheduleGrid = $("#InternScheduleGrid").data("kendoGrid"); scheduleGrid.dataSource.read(); // 获取主网格当前编辑的模型 const mainGrid = $("#InternGrid").data("kendoGrid"); const editedMainModel = mainGrid.editable.model; if (!editedMainModel) return; // 把最新的子网格数据同步到主模型 const latestSchedules = scheduleGrid.dataSource.data().toJSON(); editedMainModel.set("Schedules", latestSchedules); } }
这种方式下,子网格每做一次操作,主模型的Schedules就会立刻更新,后续主网格提交时自然就是最新数据了。
额外注意点
- 后端的
Update接口要做好Schedules的处理逻辑:比如对比原有数据和新提交的数据,处理新增、修改、删除的条目,不要直接覆盖(除非你的业务就是完全替换)。 - 如果子网格的
InternScheduleID是后端自增生成的,要确保子网格Create后,新生成的ID能同步到主模型里(上面的方法已经通过重新读取子网格数据解决了这个问题)。 - 因为你用的是InLine编辑,只有主网格进入编辑状态时才会渲染子网格,所以要确保
getParentId能正确拿到当前编辑的InternId,你的现有代码已经处理了这部分,没问题。
内容的提问来源于stack exchange,提问作者Alvaro Mancera
相关产品推荐
相关产品推荐

