2

我能够挂钩事件,还允许覆盖我的 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. 我应该打电话给 base.OnLoad(e); 在重写的 OnLoad 方法中?为什么我应该/不应该?
4

2 回答 2

2
  1. 默认情况下,OnInit并且OnLoad不是InitLoad事件的处理程序。他们习惯于火InitLoad事件。

  2. 当您覆盖时,您会更改这些方法的行为,因此事件不会被方法触发(除非您明确编写OnInit等)OnLoadbase.OnInit

  3. 如果你改变 OnLoad 的行为并且不调用基本方法,那么你可能会破坏 asp.net 应用程序的页面生命周期。例如,Load不会调用事件。

于 2013-02-02T11:18:39.457 回答
0

通常,该方法OnXxx 会引发名为 的事件Xxx。这也是一个System.Web.UI.Controllike中的情况Page

如果你这样做:

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事件触发时运行某些代码时。

于 2013-02-02T11:47:32.200 回答