ASP.Net ImageButton没有触发onclick

时间:2011-10-25 14:38:23

标签: c# asp.net ajax web-applications webforms

我正在测试两个ImageButton控件,一个在GridView_RowDataBound函数内以编程方式设置,另一个在客户端硬编码,如下所示:

静态ImageButton(Works并触发ImageButton_Click):

<asp:ImageButton OnClick="ImageButton_Click" runat="server" ID="Foo" ImageUrl="images/edit-icon.png" />

动态ImageButton(不起作用,不会触发ImageButton_Click):

 protected void gv_RowDataBound(object sender, GridViewRowEventArgs e)
        {
.
.
.

    ImageButton i = new ImageButton();
                        i.ImageUrl = "/images/edit-icon.png";
                        i.ID = "icon_" + testID.ToString();
                        i.ToolTip = "Click to add a new comment";
                        i.Click += new ImageClickEventHandler(ImageButton_Click);
                        e.Row.Cells[5].Controls.Add(i);
.
.
.

    }

动态ImageButton呈现如下

<input type="image" name="GridView1$ctl24$DGV1$ctl02$icon_1234" id="GridView1_ctl24_DGV1_ctl02icon_1234" title="Click to add a new comment" src="/images/edit-icon.png" onclick="ImageButton_Click;WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(&quot;GridView1$ctl24$DGV1$ctl02$icon_1234&quot;, &quot;&quot;, true, &quot;&quot;, &quot;&quot;, false, false))" style="border-width:0px;">

我注意到动态图像按钮包含“onclick”vs静态图像按钮,它具有“OnClick”,不确定是否会产生影响。我在过去的几个小时里一直对此感到难过,我不知道为什么动态的ImageButton没有被触发。请帮忙。

更新:

感谢所有反馈,我只需要处理ImageButton的ID,而不必是服务器端。反正我是否可以使用JavaScript从客户端执行此操作以避免回发?我尝试按如下方式重新配置ImageButton:

                      ImageButton i = new ImageButton();
                    i.ImageUrl = "/images/edit-icon.png";
                    i.ID = "icon_" + testID.ToString();
                    i.ToolTip = "Click to add a new comment";
                    i.OnClientClick = "submitComment(i.ID);return false;";
                    e.Row.Cells[5].Controls.Add(i);

我在网页表单的标题中指定了此功能

       <head runat="server">
            <script type="text/javascript">
             submitComment(i.ID){
             //Call WebMethod and pass comment along with this button's testID
}
    </script>
        </head>

但是当我点击编辑图标ImageBtn时出现以下错误:

Uncaught Reference Error: icon_12345 is not defined.

这是怎么回事?如果编辑图标已经呈现并且我只是使用客户端Javascript,那么它们是否应该已经定义并且能够被正确引用?这对我来说似乎非常直观。我在这里错过了什么吗?除了ImageButton之外还有其他一些控件,我可以用它来渲染图像而不用担心回发,但是仍然可以调用Javascript并传递它的ID吗?如何使用常规的Image控件,只需连接它的onclick属性来调用submitComment函数。

4 个答案:

答案 0 :(得分:4)

问题是在回发时,ASP.NET不记得你在上一个请求中动态添加了一个控件。该控件根本不存在于控件树中,因此事件不会触发。

尝试动态添加控件时,您会感到痛苦和痛苦。如果您希望触发事件,则必须在Page_Load之前重新创建控件。有关详细信息,请参阅http://forums.asp.net/t/1186195.aspx/1

我只是隐藏不需要它的行的ImageButton。

答案 1 :(得分:1)

每次回发都必须DataBind才能将控件重新置于ControlTree

答案 2 :(得分:0)

也许你可以试试这样的东西?只需为onclick属性创建一个带有数据绑定表达式的常规img元素。 “ID”必须是gridview数据源中的字段。

<Columns>
    <asp:TemplateField>
        <ItemTemplate>
            <img src="/images/edit-icon.png" onclick="submitComment('<%# Eval("ID", "icon_{0}") %>');"></img>
        </ItemTemplate>
    </asp:TemplateField>
</Columns>

未经测试,但之前我曾经使用过类似的东西。 ASP.NET可以挑剔地解析数据绑定表达式。

答案 3 :(得分:0)

如果您的网页已被路由,只需在加载时或您拥有表单的页面上将此代码添加到母版页

form1.Action = Request.Url.PathAndQuery;