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

ASPX项目中Ajax绑定GridView失败:表头被识别为数据行求助

问题分析与解决方案

你遇到的核心问题是客户端克隆行时误把表头行当成了数据行模板——因为初始状态下GridView没有数据行(ShowHeaderWhenEmpty="true"),tr:last-child指向的就是表头行,克隆它来生成数据行自然会导致表头被识别成数据行。另外代码还存在SQL注入风险,以及客户端绑定逻辑的其他小问题,下面是分步修复方案:

1. 修复客户端Ajax绑定逻辑(核心)

修改OnSuccess函数,不再克隆表头行,而是动态创建新的数据行,彻底避免表头被当成数据行的问题:

function OnSuccess(response) {
    var xmlDoc = $.parseXML(response.d);
    var xml = $(xmlDoc);
    var customers = xml.find("Table");
    var grid = $("[id*=bankmodulgrid]");
    
    // 先清空现有数据行(保留表头)
    grid.find("tr").not(":first").remove();
    
    $.each(customers, function () {
        var customer = $(this);
        // 动态创建新行
        var row = $("<tr></tr>");
        
        // 逐个添加单元格,对应GridView的列
        row.append($("<td></td>").text(customer.find("harid").text()));
        row.append($("<td></td>").text(customer.find("compbankhartarix").text()));
        row.append($("<td></td>").text(customer.find("carikartad").text()));
        row.append($("<td></td>").text(customer.find("compbankharesaskod").text()));
        row.append($("<td></td>").text(customer.find("compbankharesas2kod").text()));
        row.append($("<td></td>").text(customer.find("compbankharvalyuta").text()));
        row.append($("<td></td>").text(customer.find("compbankharvalmebleg").text()));
        
        // 添加操作列(删除按钮)
        var actionTd = $("<td></td>");
        var deleteBtn = $("<img />").attr({
            "src": "Images/Symbol-Delete.png",
            "class": "delete-btn" // 给按钮加类,方便后续绑定事件
        });
        actionTd.append(deleteBtn);
        row.append(actionTd);
        
        // 将行添加到GridView
        grid.append(row);
    });
    
    // 给动态添加的删除按钮绑定点击事件
    $(".delete-btn").on("click", function() {
        var row = $(this).closest("tr");
        var harid = row.find("td:first").text();
        // 这里可以调用Ajax方法执行后端删除,再刷新数据
        // 示例:deleteBankModul(harid);
        row.remove(); // 先前端删除,再同步后端
    });
}

2. 修复后端SQL注入风险(关键安全问题)

你的C#代码直接拼接SQL字符串,存在严重的SQL注入漏洞,必须改成参数化查询:

[WebMethod]
public static string bankmodulhargetirstatic(bankmodulvalues bankmodulvalues)
{
    modulkod = "FIN102";
    nomreyoxla = bankmodulvalues.bankmodulnom;
    sistemsenedid = HttpContext.Current.Session["sistemsenediyadd"]?.ToString() ?? "";

    string query = @"select har.HereketID as harid, ck.carikartad,
                     format(har.compbankhartarix,'dd-MM-yyyy') as compbankhartarix,
                     har.compbankharvalyuta,har.compbankharvalmebleg,
                     har.compbankharesaskod,har.compbankharesas2kod 
                     from compbankhar har with (Nolock) 
                     left outer join carikart ck with (nolock) on ck.carikartkod = har.compbankharmusterikod 
                     where har.compbankharkod = @nomreyoxla 
                     and har.compbankharsistemid = @sistemsenedid";

    SqlCommand cmd = new SqlCommand(query);
    // 添加参数,避免SQL注入
    cmd.Parameters.AddWithValue("@nomreyoxla", nomreyoxla);
    cmd.Parameters.AddWithValue("@sistemsenedid", sistemsenedid);

    return GetData(cmd).GetXml();
}

3. 额外优化建议

  • 改用JSON返回数据:后端可以直接返回JSON格式的数据集,客户端解析更简洁高效,比XML处理更方便。
  • 服务器端事件适配:客户端动态添加的行不会触发OnRowDeleting和OnRowDataBound事件,建议通过Ajax调用后端的删除接口,完成操作后重新绑定数据。
  • 行样式一致性:如果希望客户端生成的行和服务器端样式一致,可以在GridView的<EmptyDataTemplate>中定义一个隐藏的模板行,克隆它来生成数据行。

内容的提问来源于stack exchange,提问作者Jalal Mustafayev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:22:42