【问题标题】:asp:ImageButton not firing onclick eventasp:ImageButton 不触发 onclick 事件
【发布时间】:2010-10-21 17:48:20
【问题描述】:

我有一个使用母版页、几个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
}

&lt;form runat="server"&gt; 标记位于母版页中。上面的代码不会触发 onclick 事件。如果我摆脱母版页并向页面添加表单标签,它就可以工作。是否不支持母版页中的表单标记,或者这应该以某种方式工作? alt text http://digitalcopy.warnerbros.com/images/mainmenu.gif?provider=00079&disc=03403AAA-1D20-47F2-91FA-5EE632832659

【问题讨论】:

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


【解决方案1】:

您必须在某处以 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。而且我确信您在母版页中有一个 ScriptManager

【讨论】:

  • 母版页也有 AutoEventWireup=true,web.config 不会覆盖它。无赖。
  • 我将表单标签(和脚本管理器)从母版页移到了内容页中。该事件现在触发,我仍然有母版页。不理想,但目前已经足够解决问题了。
  • 如果您的母版页中有 UpdatePanel,请尝试将其删除
  • 否定 - 母版页中只有纯 HTML。
【解决方案2】:

根据您提供的代码,您的页面中似乎缺少&lt;asp:scriptmanager&gt;。您必须执行以下操作之一:

  1. 在页面上有&lt;asp:scriptmanagerproxy&gt;,在主页上有&lt;asp:scriptmanager&gt;
  2. 您的页面上有&lt;asp:scriptmanager&gt;,而主页上没有&lt;asp:scriptmanager&gt;

就个人而言,我建议在母版页上使用&lt;form&gt; 标签,但这是个人喜好。

【讨论】:

  • 好点。添加 scriptmanagerproxy 并没有帮助。我把表单放回master上,并将scriptmanager保留在内容页面上,这也不起作用。仅当表单和脚本管理器标签都在内容页面上时它才有效。很奇怪。
【解决方案3】:

您可以随时尝试取出 UpdatePanel 并查看它是否有效。我通常在没有 UpdatePanel 的情况下开始,让一切按我想要的方式工作,然后添加 UpdatePanel 并调试任何导致的问题。

MasterPage 中的表单对我有用,所以@Keltex 提到的 ScriptManager/ScriptManagerProxy 可能是个问题,尽管我有时会忘记它们并且通常会侥幸逃脱。

使用 UpdatePanel,按钮的点击事件将通过 Javascript 处理,因此您可以抓取 FireBug 或等效的(取决于浏览器)并跟踪实际发生的情况。它是否因验证而绊倒而您没有看到它?某处是否存在 JS 错误(控制工具包并不总是完美的)?页面实际上是否完全回传,只是没有触发事件处理程序?

【讨论】:

  • 我确实通过了 JS 并看到正在处理的事件,并且没有引发异常。为什么它没有发送到服务器对我来说并不明显。我必须深入挖掘生成的客户端代码才能理解它。删除 UpdatePanel 并没有改变行为。
  • 如果将普通按钮换成图片按钮会发生什么?它有效吗?它在所有浏览器中的行为都相同吗?
  • 仔细阅读您的评论,这听起来像是一个验证器/JS 问题,因为它没有返回到服务器。您是否有任何其他控件(例如 Control Toolkit 控件)可能会干扰图像按钮?
【解决方案4】:

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

【讨论】:

  • 它确实会触发验证,因为它可以在适当的解决方法下正常工作。
【解决方案5】:

在我的网页上,我在更新面板包含的表格内动态创建图像按钮。按钮由以下代码创建:

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 的能力,我将非常感谢

【讨论】:

  • 您应该将此作为单独的问题发布,而不是作为答案发布。
【解决方案6】:

我认为这可能与您在创建和分配事件处理程序后重新分配 id 的事实有关?

您甚至需要分配 id 吗? - 无论如何,这肯定是为你完成的吗? - 真正删除 'ib.ID = i + ":" + j;'

【讨论】:

    【解决方案7】:

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

    【讨论】:

      【解决方案8】:

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

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

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

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

      【讨论】:

        【解决方案9】:

        确保您使用 OnClick 而不是 onClick

        您的更新面板可能会干扰回发。在没有 UpdatePanel 的情况下尝试一下,看看这是否是罪魁祸首。

        【讨论】:

          【解决方案10】:

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

          应该改为

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

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

          【讨论】:

            【解决方案11】:

            我遇到了同样的问题,即 ImageButton 的 OnClick 事件没有触发。但实际问题是,在表单级别,我有onSubmit="return false;"

            【讨论】:

              【解决方案12】:

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

              【讨论】:

              • 感谢这也阻止了我的事件触发
              【解决方案13】:

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

              【讨论】:

                【解决方案14】:

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

                【讨论】:

                  【解决方案15】:

                  在上述建议都对我不起作用后,我通过调用 OnInit() 中的按钮创建又做了一次尝试。这解决了我的问题,现在 OnClick 事件正在触发。

                  【讨论】:

                    【解决方案16】:

                    这是对我有用的解决方案

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

                    【讨论】:

                      猜你喜欢
                      • 2014-11-29
                      • 2012-01-02
                      • 1970-01-01
                      • 2014-09-18
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多