【问题标题】:ASP.NET control event handler not firing on postback?ASP.NET 控件事件处理程序未在回发时触发?
【发布时间】:2011-02-07 05:01:21
【问题描述】:

我有一个控件,它有一个绑定到 OnClick 事件的ImageButton...单击此控件后,将执行回发并且不调用事件处理程序。 AutoEventWireup 设置为 true,并且我已经仔细检查了拼写等。我们已经有一年多没有碰过这个控件了,直到几周前它一直运行良好。

我们对加载此控件的控件进行了更改...所以我想知道,我们可以进行哪些更改来阻止调用此事件处理程序?有相当多的 Javascript 正在进行,所以这也可能是罪魁祸首......

编辑:一些澄清...我们正在页面的 OnLoad 事件中动态加载 ImageButton 的父控件...如果这有意义的话。

【问题讨论】:

    标签: asp.net javascript webforms postback


    【解决方案1】:

    AutoEventWireup 无关紧要。您的 ImageButton 是动态加载的,即没有在标记中写出吗?如果它在页面生命周期的后期加载到页面上,例如在 PreRender 中,事件将不会触发。

    如果存在 JavaScript 问题,您的页面甚至不会 PostBack。是这样吗?

    【讨论】:

    • 该页面绝对是后支持...只是没有事件...是的,控件看起来像是动态的(我们有一个自定义控件来加载它)。
    • 在这种情况下,请确保在生命周期的事件处理程序部分之前将其放在页面上。这意味着在 OnInit 或 OnLoad 中。如果可以,OnInit 会更好,因为它会减少 ViewState。即 Page.Controls.Add(myImageButton) 应该发生 OnInit (或 OnLoad)
    • 并且imageButton的Click事件是否也绑定了OnLoad?如果是这样,那么一些疯狂的事情正在发生......(如果你对肮脏的代码感兴趣,我有一个黑客)
    【解决方案2】:

    我完全同意 BritishDeveloper 的说法。我在动态加载控件时遇到了类似的问题,但是我无法使用Page.FindControl("controlName") 获得对控件的引用有人指出我需要牢记页面生命周期。我发现我需要确保在 PageInit 中加载控件,因为在执行异步回发之后,控件仍然存在,但没有在回发中加载,因此无法找到它。虽然这都是在 csharp 代码隐藏和 ajax 中,但我猜控件没有被重新加载。

    【讨论】:

      【解决方案3】:

      你给 ImageButton 一个 ID 了吗?

      【讨论】:

      • 是的,它肯定有一个 ID :)
      • 它的任何父控件(可能是动态创建的)是否没有 ID?大多数时候我遇到这样的事情是因为在控制树的某个地方没有分配 ID
      【解决方案4】:

      所以,事实证明我们在控件 A 中的一个按钮上设置了 PostbackUrl 属性...这导致控件 B 的事件处理程序不触发当控件 B 中的按钮被按下时。

      【讨论】:

      • 嗨,我似乎遇到了类似的问题。我想知道您是否可以详细说明您的解决方案。也许从什么是控件 A 和 B 开始?纽扣?容器?提前感谢您的帮助!
      【解决方案5】:

      如果您动态创建控件。每次使用新创建的控件触发回发时,都需要重新创建它。只需认为您的应用程序正在服务器上运行。服务器如何保存动态创建的控件的信息?不要使用 Page.IsPostBack 创建回发。 PostbackUrl 是不好的解决方案。将需要解决方法。

      【讨论】:

        【解决方案6】:

        我可以更详细一点...我只是浪费了几个小时来解决我自己的问题,类似于此处描述的问题。在创建一些搜索控件的过程中,我添加了一对 ImageButton 并在它们上设置了 PostbackUrl 属性。几天后,在测试新代码时,我注意到网络表单上的其他按钮都没有正确回发。他们会触发回发,但代码隐藏的行为就好像每个回发都是初始页面请求,并且没有任何事件处理程序被触发。

        经过几个小时的故障排除后,我发现了这篇文章。当我返回并从这两个 ImageButton 中删除 PostbackUrl 时,一切都恢复正常。我不知道它为什么会导致这个问题,但这里提到的修复对我有用。我想补充一点,我的 ImageButtons 不是动态添加的……它们在标记中,这个问题仍然出现。在您的标记中搜索设置了 PostbackUrl 的任何控件...删除它(如果需要,围绕它进行编程)...查看您的事件处理程序是否会正确触发。

        【讨论】:

          猜你喜欢
          • 2012-04-15
          • 2011-08-25
          • 1970-01-01
          • 1970-01-01
          • 2011-09-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多