手动连接Page_PreInit事件,AutoEventWireup设置为false

Cpt*_*rkt 6 c# asp.net events page-lifecycle event-handling

如果AutoEventWireup属性设置为false,则需要手动连接事件.但是,我似乎无法得到Page_PreInit解雇.我猜我可能会让连线发生得太晚(一旦我们已经过去Page_PreInit),但我不确定在哪里放置连线.

例如...

protected override void OnInit(EventArgs e)
{
    base.OnInit(e)
    PreInit += new EventHandler(Page_PreInit);
    Load += new EventHandler(Page_Load);
}

protected void Page_PreInit(object sender, EventArgs e)
{
    Response.Write("Page_PreInit event fired!<br>");  //this is never reached
}

protected void Page_Load(object sender, EventArgs e)
{
    Response.Write("Page_Load event fired!<br>");
}
Run Code Online (Sandbox Code Playgroud)

上面的代码导致"Page_Load事件被触发!" 被展示,但没有Page_PreInit.我base.OnInit(e)在连线之前和之后尝试过,这没有任何效果.

此处显示的图表表明该OnInit方法实际上是在PreInit事件发生之后.考虑到这一点,我尝试重写OnPreInit并做同样的事情 - 没有效果.

这里的MSDN文章明确指出,如果AutoEventWireup设置为false,事件可以在覆盖中连接OnInit.他们使用的例子Page_Load当然就像它对我的作用一样,但他们没有说明这似乎不适用于该Page_PreInit事件.

我的问题是:Page_PreInitAutoEventWireup设置为的情况下如何才能将事件连接起来false

我知道MSDN页面上列出了其他替代方法,例如使用页面的构造函数.我想具体知道他们建议怎么做OnInit.

Fré*_*idi 10

OnPreInit()方法的基本实现负责引发PreInit事件.由于您的覆盖注册PreInit处理程序之前调用该实现,因此确实不会调用它.

注册处理程序尝试调用基类的方法:

protected override void OnPreInit(EventArgs e)
{
    PreInit += new EventHandler(Page_PreInit);
    Load += new EventHandler(Page_Load);

    // And only then:
    base.OnPreInit(e);
}
Run Code Online (Sandbox Code Playgroud)