Page_Init vs OnInit

时间:2009-08-10 16:03:41

标签: asp.net

在处理Page_Init事件或覆盖Page的OnInit方法之间,最好使用哪一个?谢谢。

6 个答案:

答案 0 :(得分:17)

一年前我有这个问题,我决定重写而不是On_X事件。以下是我阅读的文章,其中包含优缺点:http://weblogs.asp.net/infinitiesloop/archive/2008/03/24/onload-vs-page-load-vs-load-event.aspx

答案 1 :(得分:11)

最好覆盖基类型的方法,因为虚拟调用比创建将事件附加到方法组的委托更简单,更清晰。

此外,依赖AutoEventWireup设置为true意味着您在解析页面代码时引入了开销,因为ASP.NET必须在执行时为您创建任何委托。

答案 2 :(得分:3)

基本上这两个方面没有区别。 这是在Page class中的OnInit中所做的:

protected internal override void OnInit(EventArgs e)
{
    base.OnInit(e);
    if (this._theme != null)
    {
        this._theme.SetStyleSheet();
    }
    if (this._styleSheet != null)
    {
        this._styleSheet.SetStyleSheet();
    }
}

如果我们打开base.OnInit,我们将会看到那是触发Page_Init的地方:

protected internal virtual void OnInit(EventArgs e)
{
    if (this.HasEvents())
    {
        EventHandler handler = this._occasionalFields.Events[EventInit] as EventHandler;
        if (handler != null)
        {
            handler(this, e);
        }
    }
}

所以基本上这两种方法没有区别。 但是,如果您选择使用override而不是event,则需要在overriden方法中调用 base.OnInit 。 另一个区别是,如果你使用覆盖,你可以在应用主题后运行一些代码。

问候。

P.S。我建议的唯一方法是在整个应用程序中使用相同的方法。

答案 3 :(得分:1)

这里有一个很好的答案http://objectmix.com/dotnet/251824-oninit-page_init.html

http://www.justskins.com/forums/page_init-and-page_load-59045.html有更深入的答案。

如果AutoEventWireup设置为false,则需要覆盖OnInit,因为Page_Init不会自动可用。

答案 4 :(得分:1)

OnInit更好,因为它是在类级别初始化,而页面init可能具有冗余效果,因为你必须检查它是否是回发。

答案 5 :(得分:0)

OnX因为它主要是根据MSDN在派生类中处理事件的首选技术。