asp:ImageButton未触发onclick事件

10

我有一个使用了母版页、多个RequiredFieldValidators和Web Toolkit自动完成扩展程序的页面。以下代码仅显示页面的最少内容:

<%@ Page Language="C#" 
    AutoEventWireup="true"  
    CodeFile="Login.aspx.cs" 
    MasterPageFile="~/master.master" 
    Inherits="Login" %>

<asp:Content id="Content1" 
    contentplaceholderid="ContentPlaceHolder1" 
    runat="server">
    <asp:UpdatePanel ID="pnlUpdate" runat="server">
        <ContentTemplate>
            <div>
                <asp:ImageButton class="submitButton" 
                    imageurl="images/button_submit.gif" 
                    id="btnSubmit" 
                    runat="server" 
                    onclick="btnSubmit_ServerClick"/>
            </div>
        </ContentTemplate>
    </asp:UpdatePanel>
</asp:Content>

后台代码:

protected void btnSubmit_ServerClick
      (object sender, ImageClickEventArgs e)
{
    //breakpoint here does not get hit
}

<form runat="server">标签位于母版页中。上述代码不触发 onclick 事件。如果我去掉母版页并在页面中添加一个 form 标签,它就可以工作了。是母版页中的 form 标签不受支持,还是它应该以某种方式工作?alt text http://digitalcopy.warnerbros.com/images/mainmenu.gif?provider=00079&disc=03403AAA-1D20-47F2-91FA-5EE632832659


对我有效的唯一答案来自另一个问题。 :) http://stackoverflow.com/a/15911261/1603799 - MiniRagnarok
16个回答

12

您也可以检查ImageButton是否不触发验证。如果是,请将其CausesValidation属性设置为false(当然,如果有意义的话)。


它确实会触发验证,因为使用解决方法后可以正常工作。 - cdonner

4

我的解决方案是将ImageButton的CausesValidation属性设置为false。


谢谢,这个问题也阻止了我的事件触发。 - JsonStatham

4

我遇到了类似的问题(不同的情况)。我使用了Page.RegisterRequiresRaiseEvent(ImageButton) ,然后我的onclick事件开始触发。为什么我需要这样做?我不知道。


2

ib.ID = `${i}:${j}`;

应更改为

ib.ID = i.toString()+":"+j.toString();

如果仍然无法正常工作,请尝试使用StringBuilder来构建ID,并将其稍后分配给ib.ID属性。

2

我有一个与图像按钮类似的问题,并找到了根本原因。您正在使用

"ib.ID = i + ":" + j;"

作为 ImageButton 的 ID,":" 是不合法的名称,在程序中创建时,ASP.NET 允许它被创建。

运行时,如果查看页面的 HTML 源代码,您会发现特殊字符要么被忽略,要么被替换为 "_"。因此,页面无法找到正确的控件,事件也将无法触发。尝试更改名称为纯文本,事件将会触发。


1
这是对我有效的解决方案。
如果你通过数据绑定控件进行绑定,那么请使用OnCommand属性而不是OnClick属性。

0

你必须在某个带有runat=server属性的表单中拥有控制权,它可以在主页面或.aspx文件中。请仔细检查主页面表单标记是否为runat=server。

AutoEventWireup是允许您使用的语法属性。请仔细检查主页面、WebForm中的设置,也可以在web.config中进行设置。

如果这样做不起作用,您总是可以显式编码(我更喜欢这种方式)。

<script runat=server>

protected override void OnInit(EventArgs e)
    {
        btnSubmit.Click += delegate(object sender, EventArgs e1)
        {

        };
        base.OnInit(e);
    }

</script>

UpdatePanel 可能会干扰服务器端事件的触发,因此请尝试不使用 UpdatePanel。我相信您的 Master Page 中有 ScriptManager。


母版页也具有AutoEventWireup=true,而且web.config没有覆盖它。糟糕。 - cdonner
我将表单标签(以及脚本管理器)从母版页移动到内容页。现在事件可以触发,而且我仍然拥有母版页。虽然不是理想的解决方案,但现在已经足够应付。 - cdonner
如果您的主页面中有UpdatePanel,请尝试将其移除。 - Chad Grant
只有纯HTML在主页面中,没有负面影响。 - cdonner

0

在我的网页上,我正在动态地在一个包含在UpdatePanel中的表格内创建图像按钮。这些按钮是通过以下代码创建的:

for (int i = 0; i < 15; i++)
    {
        TableRow tr = new TableRow();
        for (int j = 0; j < 20; j++)
        {
            TableCell tc = new TableCell();
            ImageButton ib = new ImageButton();
            ib.Click += new ImageClickEventHandler(ImageButton1_Click);
            ib.ImageUrl = "../img/defaultCell.jpg";
            ib.ID = i + ":" + j;
            tc.Controls.Add(ib);
            tc.Width = 25;
            tc.Height = 25;
            tr.Cells.Add(tc);
        }
        GameTable.Rows.Add(tr);
    }

}

图像按钮将不会触发单击事件。 但是,如果注释掉“ib.ID = ...”行,则可以触发单击事件!这个单一的变化似乎修复了所有问题。我不知道为什么。如果有人能够解释这一点,并告诉我如何触发事件并保持设置按钮ID的能力,我将非常感谢。

3
你应该将这个问题作为一个单独的问题发布,而不是作为一个回答。 - Bill the Lizard

0
我遇到了与ImageButton的OnClick事件无法触发相同的问题。但实际问题是,在表单级别上,我有onSubmit ="return false;"

0

我刚刚解决了一个类似的问题,其中启用了OutputCache。当从asp:ImageButton更改为asp:Button时,事件会被正确触发。可能asp:ImageButton在OutputCache方面存在一些bug。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接