代码之家  ›  专栏  ›  技术社区  ›  Glenn Slaven

如果asp.net控件的事件没有绑定,我应该检查哪些内容,以确定可能的原因?

  •  1
  • Glenn Slaven  · 技术社区  · 15 年前

    所以我有一个ASP.NET控件,它带有一个服务器窗体和一堆 runat="server" 使用标记中定义的事件。但是,当我单击按钮时,没有任何事件发生。回发发生在 Page_Load 事件 IsPostback 这是真的。

    更新:我已经放弃了这个代码。当我检查完这里提到的所有内容后,仍然会发生haing回发,但没有事件触发,我已经返回到以前的稳定状态,我将重新开始

    4 回复  |  直到 15 年前
        1
  •  3
  •   cdonner    15 年前

    这是给猫剥皮的有趣方法。你不是在问“我做错了什么”,而是在问“我可能做错了什么”。

    如果表单发回,则触发事件。我认为这是一个很好的例子。如果您没有看到正在调用的事件处理程序,则可能您看到的位置不对。

    我发现这种方法在这种情况下很有用。我从page_load调用它,在调用事件处理程序之前,它向我显示了导致事件触发的详细信息。

        /// <summary>
        /// Find which control caused the post back
        /// </summary>
        /// <param name="page"></param>
        /// <returns></returns>
        public static System.Web.UI.Control 
                     GetPostBackControl(System.Web.UI.Page page) {
            Control control = null;
            string ctrlname = page.Request.Params["__EVENTTARGET"];
            if (ctrlname != null && ctrlname != String.Empty) {
                control = page.FindControl(ctrlname);
            }
            // if __EVENTTARGET is null, the control is a button type and we need to 
            // iterate over the form collection to find it
            else {
                string ctrlStr = String.Empty;
                Control c = null;
                foreach (string ctl in page.Request.Form) {
                    // handle ImageButton controls ...
                    if (ctl.EndsWith(".x") || ctl.EndsWith(".y")) {
                        ctrlStr = ctl.Substring(0, ctl.Length - 2);
                        c = page.FindControl(ctrlStr);
                    }
                    else {
                        c = page.FindControl(ctl);
                    }
                    if (c is System.Web.UI.WebControls.Button ||
                             c is System.Web.UI.WebControls.ImageButton) {
                        control = c;
                        break;
                    }
                }
            }
            return control;
        }
    
        2
  •  1
  •   Ralph Willgoss    15 年前

    您说过会发生回发,那么您是否对您想要触发的事件进行了某种形式的中断/日志记录,但该事件从未实现?

    您是否有可能关闭了ViewState?


    我强烈建议学习这个 great diagram on the ASP.Net Page Life Cycle .

    在控件中看不到代码的情况下,您可能在页面生命周期的错误点连接事件或创建控件,因此您要触发的事件创建得太晚而无法触发。

    当.Net仍在连接客户端javascript以进行回发时,该控件似乎可以工作。

    进一步阅读可能会有所帮助:

    MSDN: ASP.NET Page Life Cycle Overview

        3
  •  0
  •   jaywon    15 年前

        4
  •  0
  •   RickNZ    15 年前

    我应该检查什么以了解原因 事件不会发生?有什么问题 不受约束?

    1. Page_Load()或更高版本中的事件绑定(应在Page_Init()或来自标记)
    2. 禁用 ViewState
    3. 在页面生命周期的早期采取一些措施来禁用事件或使其看起来从未发生过
    4. 事件实际上正在运行,您只是看不到它,因为您正在寻找输出中的一些更改,而不是使用调试器