类中的事件和虚拟方法 System.Web.UI.Page
本文关键字:System Web UI Page 方法 虚拟 事件 | 更新日期: 2023-09-27 17:57:13
我能够挂接事件,并且还允许覆盖加载和初始化..,我的aspx代码隐藏文件中的事件。我有以下问题。
public partial class Default : System.Web.UI.Page
{
public Default()
{
this.Init += Default_Init;
this.Load+=Default_Load;
}
protected void Default_Load(object sender, EventArgs e)
{ }
protected void Default_Init(object sender, EventArgs e)
{ }
protected override void OnLoad(EventArgs e)
{ }
protected override void OnInit(EventArgs e)
{ }
}
问:
- 为什么这样的选项(虚拟方法和事件处理程序)存在于 Page 类中?
- 执行重写方法时,我的事件处理程序(Default_Load 和 Default_Init)不会执行。 背后的原因是什么?
- 我应该打电话给基地吗?加载(e);在覆盖的 OnLoad 方法中?为什么我应该/不应该?
-
默认情况下,
OnInit
和OnLoad
不是Init
和Load
事件的处理程序。它们用于触发Init
和Load
事件。 -
重写时,会更改这些方法的行为,因此,
OnInit
和OnLoad
方法不会触发事件(除非您显式编写base.OnInit
等)。 -
如果更改 OnLoad 的行为并且不调用基方法,则可能会中断 asp.net 应用程序的页面生命周期。例如,不会调用
Load
事件。
通常,方法OnXxx
引发名为 Xxx
的事件。像Page
这样的System.Web.UI.Control
也是如此。
如果您这样做:
protected override void OnLoad(EventArgs e)
{
// nothing here!
}
您更改了OnLoad
的行为,使其现在不执行任何操作。因此,很可能没有人会提出("火灾")Load
事件。因此,它的事件处理程序永远不会运行。
相反,如果您这样做:
protected override void OnLoad(EventArgs e)
{
// maybe add some code of your own here ...
base.OnLoad(e);
// ... or here
}
然后,基调用将确保该方法仍引发事件。
如果您位于声明事件的类中,则只能显式引发事件,即调用基础委托。所以这对你来说是不可能的。定义Load
的基类如下所示:
// inside same class where 'Load' event is defined:
protected virtual void OnLoad(EventArgs e)
{
// maybe they put some other code here ...
var loadDelegate = Load; // gets the current underlying delegate of the event
if (loadDelegate != null)
loadDelegate(this, e);
// ... or here
}
但在大多数情况下,您根本不应该override
任何方法。只需在您希望在 Load
事件触发时运行某些代码时添加到Load
即可。