GridView中调用JavaScript打开页面时如何获取对应行的正确ID值
GridView中调用JavaScript打开页面时如何获取对应行的正确ID值
我完全懂你的困扰——现在不管点击GridView里哪一行的超链接,弹出的对话框里总是加载最后一行ID对应的页面,对吧?问题出在你当前的实现方式:你在RowDataBound方法里循环修改全局的commentPage的src属性,每绑定一行就覆盖一次这个值,等所有行绑定完成后,这个src就只剩最后一行的ID了,所以不管点哪行,都是用这个最后设置的地址。
下面是解决这个问题的具体步骤,改完就能拿到对应行的正确ID了:
1. 修改后台RowDataBound方法
不要在后台提前设置commentPage的src,而是把当前行的ID直接传递给JavaScript函数:
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { HyperLink commentHyperLink = (HyperLink)e.Row.FindControl("CommentHyperLink"); int _id = Convert.ToInt32(DataBinder.Eval(e.Row.DataItem, "ID")); // 把当前行的ID作为参数传给showComments函数 commentHyperLink.Attributes.Add("onclick", $"showComments({_id}); return false;"); // 如果需要兼容老版本C#(不支持$字符串插值),可以用下面的写法: // commentHyperLink.Attributes.Add("onclick", string.Format("showComments({0}); return false;", _id)); return; } }
2. 调整JavaScript函数,接收ID参数并动态设置iframe地址
修改showComments函数,让它接收ID参数,然后在打开对话框前动态设置commentPage的src:
function showComments(id) { var mydiv = $('#commentDiv'); var commentIframe = $('#commentPage'); // 用传入的ID动态生成iframe的地址 commentIframe.attr('src', 'Page2.aspx?id=' + id); mydiv.dialog({ autoOpen: false, modal: true, title: 'My Comments', width: '50%', position: { my: 'top', at: 'top+150' } }); // 打开对话框 mydiv.dialog('open'); }
3. 确保前台iframe的ID能被JS正确找到(可选但推荐)
因为你的commentPage是runat="server"的控件,ASP.NET可能会自动修改它的客户端ID,导致JS找不到。可以给它加上ClientIDMode="Static",保证客户端ID和后台ID一致:
<iframe id="commentPage" name="commentPage" runat="server" ClientIDMode="Static"></iframe>
原理说明
现在每个超链接的onclick事件都会携带自己对应行的ID,点击时把ID传给JS函数,JS再用这个ID生成正确的页面地址,这样就不会出现所有行共用最后一个ID的问题了——每点一行,就用该行的ID动态设置iframe的地址,完美解决你的问题。
备注:内容来源于stack exchange,提问作者aantiix
相关产品推荐
相关产品推荐

