类中的事件和虚拟方法 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)
    {        }
}

问:

  1. 为什么这样的选项(虚拟方法和事件处理程序)存在于 Page 类中?
  2. 执行重写方法时,我的事件处理程序(Default_Load 和 Default_Init)不会执行。 背后的原因是什么?
  3. 我应该打电话给基地吗?加载(e);在覆盖的 OnLoad 方法中?为什么我应该/不应该?

类中的事件和虚拟方法 System.Web.UI.Page

  1. 默认情况下,OnInitOnLoad 不是InitLoad事件的处理程序。它们用于触发InitLoad事件。

  2. 重写时,会更改这些方法的行为,因此,OnInitOnLoad 方法不会触发事件(除非您显式编写base.OnInit等)。

  3. 如果更改 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即可。