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)
问题是:生命周期是什么样的?首先执行什么?其中一个甚至被执行了吗?
前面两点:
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)
| 归档时间: |
|
| 查看次数: |
1115 次 |
| 最近记录: |