【问题标题】:Mark-up Button Event Not Firing in ASP.NET (Details inside)在 ASP.NET 中未触发标记按钮事件(内部有详细信息)
【发布时间】:2010-09-01 19:04:00
【问题描述】:

标记没有什么花哨的:

<hr />
Add... <asp:Button ID="buttonTextSegment" runat="server" Text="Text Segment" 
    onclick="buttonTextSegment_Click" />
<hr />

或者代码:

protected void buttonTextSegment_Click(object sender, EventArgs e)
{
   //never is triggered
}

我的猜测是由于层次结构/加载顺序:

英文:在页面的 Load 内部,它添加了一个用户控件。在该用户控件内部,在 Page_LoadComplete 内部(这是问题所在!?),它添加了另一个用户控件,它是包含标记按钮的最里面的用户控件。

伪视觉:页面 -> Page_Load:动态添加的用户控件 -> Page_LoadComplete:另一个动态添加的用户控件 -> 用户控件标记:带有事件的按钮。

是否需要在 LoadComplete 之前挂钩事件? (有没有办法让事件仍然有效,即使控件已添加到 LoadComplete 中?)

【问题讨论】:

    标签: asp.net events user-controls button markup


    【解决方案1】:

    您应该按此顺序创建用户控件 Page -> Page_Init:动态添加的用户控件 -> Page_Init:另一个动态添加的用户控件 -> 用户控件标记。

    如果您在 Page_Load 或 Page_LoadComplete 函数中执行它们,那么对于事件处理程序来说,它们创建得太晚了,因为事件处理程序在 LoadControlState 事件之后直接触发 - 这发生在 Page_Init 和 Page_Load 事件之间。

    【讨论】:

    • 如果我需要通过单击按钮添加控件怎么办?按钮单击的效果仅在 Page_LoadComplete 之后出现(由于页面的生命周期)?
    • 根据曾经流行的页面生命周期文章 (msdn.microsoft.com/en-us/library/ms178472.aspx),在 Page_Load 之后触发回发事件。所以理论上,如果你在 Page_Load 中创建/添加你的控件,那应该没问题。但是,您是对的:OnLoadComplete 是在回发事件被触发之后,因此在那里创建控件为时已晚。
    • 具体来说,您可以在LoadComplete中添加控件,它们会显示出来。但是,与它们挂钩的任何事件都不起作用。问题是:为什么?
    • 如果您在 LoadComplete 中添加控件(或在 RenderComplete 之前的任何时间),控件将出现。但是,您将无法响应事件,因为回发后事件处理程序将不可用,因为您必须首先重新创建控件才能处理事件。这更有意义吗?
    • 我明白了。但它创造了完美的疯狂风暴:stackoverflow.com/questions/3622479/… 目标(动态添加包含事件的控件)解决方案相互矛盾,导致先有鸡还是先有蛋的问题。
    猜你喜欢
    • 1970-01-01
    • 2013-07-02
    • 2016-08-02
    • 2013-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-18
    • 1970-01-01
    相关资源
    最近更新 更多