模态框中Telerik RadGrid经jQuery绑定后BatchEditCommand无法取值
问题分析
你用前端jQuery直接给RadGrid设置数据源并绑定的方式属于纯客户端数据加载,这种情况下RadGrid的BatchEdit模块不会自动把客户端的数据变更同步到服务端的GridBatchEditingEventArgs里——因为服务端控件根本不知道你前端塞了哪些数据,回传时表单里没有这些数据的提交项,自然在OnBatchEditCommand里拿不到OldValues和NewValues。
解决方案
方案1:改用RadGrid官方客户端绑定模式
不要直接调用set_dataSource,而是配置RadGrid使用官方客户端绑定,让控件自己管理数据的前后端同步:
- 在ASPX中配置RadGrid开启客户端绑定:
<telerik:RadGrid ID="RadGrid2" runat="server" EnableBatchEditing="true"> <MasterTableView DataKeyNames="ID" ClientDataKeyNames="ID"> <Columns> <telerik:GridBoundColumn DataField="Name" UniqueName="Name" HeaderText="名称" /> <!-- 其他列必须设置DataField和UniqueName --> </Columns> </MasterTableView> <ClientSettings> <DataBinding Location="YourDataService.asmx" SelectMethod="GetData" /> </ClientSettings> </telerik:RadGrid>
- 手动刷新数据时使用官方API:
var grid = $find("<%= RadGrid2.ClientID %>"); grid.get_masterTableView().rebind();
这种方式下控件会自动跟踪数据变更,回传时OnBatchEditCommand就能正常获取到值。
方案2:纯客户端绑定后手动同步数据到服务端
如果必须用自定义数据源绑定,需在提交时手动收集变更数据:
- 前端收集编辑数据并存入隐藏字段:
function onBatchSave() { var tableView = $find("<%= RadGrid2.ClientID %>").get_masterTableView(); var batchManager = tableView.get_batchEditingManager(); var editedItems = batchManager.get_editedItems(); // 转成JSON字符串存入隐藏字段 $("#hdnGridChanges").val(JSON.stringify(editedItems)); }
- 后台读取隐藏字段内容处理:
protected void RadGrid1_BatchEditCommand(object sender, GridBatchEditingEventArgs e) { string changesJson = Request.Form["hdnGridChanges"]; if (!string.IsNullOrEmpty(changesJson)) { // 反序列化到实体列表(需引用Newtonsoft.Json或使用.NET自带序列化) List<YourModel> editedItems = JsonConvert.DeserializeObject<List<YourModel>>(changesJson); // 处理业务逻辑 } }
方案3:用客户端API手动操作行
不要直接替换整个数据源,用RadGrid的客户端API添加/更新行,让控件跟踪变更:
// 添加新行 var tableView = $find("<%= RadGrid2.ClientID %>").get_masterTableView(); var newItemIndex = tableView.addNewItem(); var newItem = tableView.get_dataItems()[newItemIndex]; newItem.set_cellValue("Name", "新名称"); // 更新现有行 var targetItem = tableView.get_dataItems()[0]; tableView.get_batchEditingManager().openRowForEdit(targetItem.get_element()); targetItem.set_cellValue("Name", "修改后的名称");
这种操作下控件会记录变更集合,回传时OnBatchEditCommand就能正常获取OldValues和NewValues。
关键注意点
- 参与Batch编辑的列必须设置
UniqueName,服务端通过该属性识别字段。 - 不要混合纯客户端绑定和服务端绑定,避免控件状态混乱。
- 模态框中的RadGrid要确保在显示前完成初始化,防止API调用失败。
内容的提问来源于stack exchange,提问作者Sheheryar Nasir
相关产品推荐
相关产品推荐

