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

Ale*_*xus 6 c# asp.net webforms

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

protected override void OnPreRender(EventArgs e) { }
Run Code Online (Sandbox Code Playgroud)

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

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

    }
</script>
Run Code Online (Sandbox Code Playgroud)

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

M4N*_*M4N 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>
Run Code Online (Sandbox Code Playgroud)

请注意,在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)
 {
 }
Run Code Online (Sandbox Code Playgroud)