前几天我正在重构一些旧网站,并偶然发现了这种情况。我有一个ASP.NET 3.5 C#WebForms页面。在后面的代码中,我有一个像这样的事件处理程序:
protected override void OnPreRender(EventArgs e) { }
另一方面,在标记中,我也有:
<script language="C#" runat="server">
void Page_PreRender()
{
}
</script>
问题是:生命周期是什么样的?首先执行什么?其中一个甚至被执行了吗?
答案 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)
{
}