如何为GridView中OnClientClick的window.open添加参数并解决服务器标签错误
错误原因
- 服务器标签解析失败核心是引号嵌套冲突:服务器控件属性默认用双引号包裹时,内部
<%# Eval() %>的双引号会和外层属性引号冲突,导致ASP.NET解析器无法正确识别标签结构 - URL参数语法错误:参数位多写了冗余问号,
client_id?=的正确写法应为client_id= - JS调用语法错误:
window.open调用结束后多余的+'属于无效语法,同时没有阻止按钮默认回发行为,可能触发不必要的页面刷新
解决方案1:直接修正前台绑定代码
把OnClientClick属性外层改用单引号包裹,修正URL和JS语法,同时添加return false阻止按钮回发:
<asp:Button ID="btnViewClient" runat="server" Text="View Client" CssClass="btn" OnClientClick='<%# "window.open(\"http://localhost:5000/test/test.aspx?client_id=" + Eval("id") + "\",\"_blank\");return false;" %>' />
注:URL前添加
http://避免被识别为相对路径,_blank参数强制在新标签页打开
解决方案2:使用RowDataBound事件绑定(更易维护)
如果不想处理前台复杂的引号嵌套,可以在GridView的RowDataBound事件中动态赋值点击事件,不会和已有的SelectedIndexChanged事件冲突:
- 先给GridView添加RowDataBound事件绑定:
<asp:GridView ID="gvYourGrid" runat="server" OnRowDataBound="gvYourGrid_RowDataBound"> <!-- 其余原有列配置保持不变 --> </asp:GridView>
- 后台对应事件代码:
protected void gvYourGrid_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { Button btnViewClient = (Button)e.Row.FindControl("btnViewClient"); string clientId = DataBinder.Eval(e.Row.DataItem, "id").ToString(); btnViewClient.OnClientClick = $"window.open('http://localhost:5000/test/test.aspx?client_id={clientId}','_blank');return false;"; } }
内容的提问来源于stack exchange,提问作者A.Mac
相关产品推荐
相关产品推荐

