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

如何为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事件冲突:

  1. 先给GridView添加RowDataBound事件绑定:
<asp:GridView ID="gvYourGrid" runat="server" OnRowDataBound="gvYourGrid_RowDataBound">
    <!-- 其余原有列配置保持不变 -->
</asp:GridView>
  1. 后台对应事件代码:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 03:42:02