在此 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)
{
}
前几天我在重构一些旧网站时偶然发现了这种情况。我有一个 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/connectedPreRender
事件,因此不会被调用。您还可以手动将处理程序附加到事件,例如:
protected void Page_Load(object sender, EventArgs e)
{
PreRender += PreRenderEventHandler;
}
void PreRenderEventHandler(object sender, EventArgs e)
{
}