asp:ImageButton没有触发onclick事件

时间:2009-04-25 01:18:51

标签: asp.net webforms master-pages onclick imagebutton

我有一个页面,它使用母版页,几个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事件。如果我删除母版页并向页面添加表单标签,它就可以工作。是否不支持母版页中的表单标记,或者这应该以某种方式工作? alt text http://digitalcopy.warnerbros.com/images/mainmenu.gif?provider=00079&disc=03403AAA-1D20-47F2-91FA-5EE632832659

16 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分:4)

我有类似的问题(不同的情况)。我使用Page.RegisterRequiresRaiseEvent(ImageButton)并且我的onclick事件开始激活。为什么我需要这样做?我不知道。

答案 2 :(得分:3)

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

答案 3 :(得分:2)

我在图像按钮上遇到了类似的问题并找到了根本原因。您正在使用

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

作为ImageButton的ID,“:”是非法使用的名称,因为您以编程方式创建它,ASP.NET允许创建它。

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

答案 4 :(得分:2)

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

应改为

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

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

答案 5 :(得分:0)

你必须在某个地方使用runat = server形式的控件,它可以在Master页面或.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的情况下尝试它。我相信你在母版页中有一个ScriptManager

答案 6 :(得分:0)

从您提供的代码中,您似乎错过了页面中的<asp:scriptmanager>。您必须执行以下操作之一:

  1. 页面上有<asp:scriptmanagerproxy>,母版页上有<asp:scriptmanager>
  2. 页面上有<asp:scriptmanager>,母版页上没有<asp:scriptmanager>
  3. 就个人而言,我建议在母版页上使用<form>标记,但这是个人偏好。

答案 7 :(得分:0)

您可以随时尝试取出UpdatePanel,看看它是否有效。我通常在没有UpdatePanel的情况下启动,以我想要的方式工作,然后添加UpdatePanel并调试导致的任何内容。

MasterPage中的表单对我有用,所以@Keltex提到的ScriptManager / ScriptManagerProxy可能是一个问题,虽然我有时会忘记它们并且通常可以使用它。

使用UpdatePanel,按钮的点击事件将通过Javascript处理,因此您可以使用FireBug或等效的(取决于浏览器)并按照实际情况进行操作。是否绊倒验证,你没有看到它?某处是否存在JS错误(Control Toolkit总是不完美)?该页面实际上是回发而只是没有命中事件处理程序吗?

答案 8 :(得分: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的能力,我会非常感激

答案 9 :(得分:0)

我认为这可能与你在创建&amp;之后重新分配id的事实有关。分配事件处理程序?

你甚至需要分配id吗? - 当然这是为你完成的吗? - 真正删除'ib.ID = i +“:”+ j;'

答案 10 :(得分:0)

确保使用点击而不是 onClick

您的更新面板可能会弄乱回发。尝试不使用UpdatePanel,看看是否是罪魁祸首。

答案 11 :(得分:0)

我有同样的问题,即ImageButton的OnClick事件未触发。但实际问题是,在表单层面,我有onSubmit="return false;"

答案 12 :(得分:0)

我遇到了同样的问题,我正在动态创建一个ImageButton,并且没有触发该事件的点击。因此,我在if(IsPostBack)中创建了Image按钮。现在工作正常。即使页面刷新,也会保留ImageButton。

答案 13 :(得分:0)

我刚刚解决了启用OutputCache的类似问题。从asp:ImageButton更改为asp:Button时,会正确触发事件。可能asp:ImageButton在OutputCache上有一些错误。

答案 14 :(得分:0)

在上述建议都不适用于我之后,我再次尝试通过调用OnInit()中的按钮创建。这解决了我的问题,现在OnClick事件正在解决。

答案 15 :(得分:0)

这是适合我的解决方案

如果您通过数据绑定控件进行绑定,则使用OnCommand attr而不是OnClick attr