【问题标题】:What methods are executed in which order in this ASP.NET webforms page在这个 ASP.NET webforms 页面中按什么顺序执行什么方法
【发布时间】:2015-04-27 21:07:40
【问题描述】:

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

protected override void OnPreRender(EventArgs e) { }

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

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

    }
</script>

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

【问题讨论】:

标签: c# asp.net webforms


【解决方案1】:

提前两点:

  • 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()。如上所述,如果缺少它,则不会引发 PreRenderevent,因此不会调用事件处理程序。

您的代码示例

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

还有几点需要考虑

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

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


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

【讨论】:

  • 非常感谢您的广泛回答。它为我清除了一切:) 本质上,我确实有 base.OnPreRender 方法调用,我只是在将代码粘贴到此处时将其删除。我不知道它在这种情况下具有如此重要的作用。我想要清除它的原因是因为我想将所有 C# 移动到文件后面的代码中并且不确定顺序会是什么样的,但现在我知道该怎么做了 :)
猜你喜欢
  • 1970-01-01
  • 2021-11-03
  • 2011-09-27
  • 2016-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-16
  • 2019-01-04
相关资源
最近更新 更多