在此 ASP.NET 网络表单页面中以何种顺序执行哪些方法

What methods are executed in which order in this ASP.NET webforms page

前几天我在重构一些旧网站时偶然发现了这种情况。我有一个 ASP.NET 3.5 C# WebForms 页面。在后面的代码中,我有一个这样的事件处理程序:

protected override void OnPreRender(EventArgs e) { }

另一方面,在标记中,我还有:

<script language="C#" runat="server">
    void Page_PreRender()
    {

    }
</script>

问题是:生命周期是什么样的?首先执行什么?其中一个甚至被处决了吗?

提前两点:

  • OnPreRender 方法不是事件处理程序。它是方法 Page.OnPreRender 的重写(这是将引发 PreRender 事件的方法)。
  • 方法 Page_PreRender 自动连接到 PreRender 事件。所以这是一个事件处理程序(针对 PreRender 事件)。

调用顺序

以下代码示例显示了执行顺序:

// code-behind
protected override void OnPreRender(EventArgs e)
{
    // 1. code put here will be executed first

    // now we call the base class' version, which will then raise the
    // PreRender event
    base.OnPreRender(e);

    // 3. code put here will be executed last
}

// markup       
<script language="C#" runat="server">
    void Page_PreRender()
    {
        // 2. code put here will be executed second
    }
</script>

请注意,在 OnPreRender() 中,基数 class 被调用:base.OnPreRender()。如上所述,如果缺少此项,则不会引发 PreRender 事件,因此不会调用事件处理程序。

您的代码示例

在您的示例代码中,缺少对 base.OnPreRender 的调用。这意味着,不会引发 PreRender 事件,因此不会调用(事件处理程序)方法 Page_PreRender()

还有几点需要考虑

  • 如果您的标记和代码隐藏中有一个 Page_PreRender() 事件处理程序,那么只会调用代码隐藏中的事件处理程序。

  • 如果您在页面指令中禁用事件的自动装配(例如 < % @ Page AutoEventWireup="false" ... % >),那么 Page_PreRender() 事件处理程序将不会 wired/connected PreRender 事件,因此不会被调用。

  • 您还可以手动将处理程序附加到事件,例如:


 protected void Page_Load(object sender, EventArgs e)
 {
     PreRender += PreRenderEventHandler;
 }
 void PreRenderEventHandler(object sender, EventArgs e)
 {
 }