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

模态框中Telerik RadGrid经jQuery绑定后BatchEditCommand无法取值

问题分析

你用前端jQuery直接给RadGrid设置数据源并绑定的方式属于纯客户端数据加载,这种情况下RadGrid的BatchEdit模块不会自动把客户端的数据变更同步到服务端的GridBatchEditingEventArgs里——因为服务端控件根本不知道你前端塞了哪些数据,回传时表单里没有这些数据的提交项,自然在OnBatchEditCommand里拿不到OldValues和NewValues。

解决方案

方案1:改用RadGrid官方客户端绑定模式

不要直接调用set_dataSource,而是配置RadGrid使用官方客户端绑定,让控件自己管理数据的前后端同步:

  1. 在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>
  1. 手动刷新数据时使用官方API:
var grid = $find("<%= RadGrid2.ClientID %>");
grid.get_masterTableView().rebind();

这种方式下控件会自动跟踪数据变更,回传时OnBatchEditCommand就能正常获取到值。

方案2:纯客户端绑定后手动同步数据到服务端

如果必须用自定义数据源绑定,需在提交时手动收集变更数据:

  1. 前端收集编辑数据并存入隐藏字段:
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));
}
  1. 后台读取隐藏字段内容处理:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 02:36:18