在此ASP.NET webforms页面中以哪种顺序执行哪些方法

时间:2015-04-27 21:07:41

标签: c# asp.net webforms

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

protected override void OnPreRender(EventArgs e) { }

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

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

    }
</script>

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

1 个答案:

答案 0 :(得分:2)

预先两点:

  • 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()内部调用基类:base.OnPreRender()。如上所述,如果缺少此参数,则不会引发PreRender事件,因此不会调用事件处理程序。

您的代码示例

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

需要考虑更多要点

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

  • 如果禁用Page指令中事件的自动连接(例如< % @ Page AutoEventWireup="false" ... % >),则Page_PreRender()事件处理程序将不会与PreRender连接/连接因此不会被召唤。

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

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