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
相关产品推荐
相关产品推荐

