在处理Page_Init事件或覆盖Page的OnInit方法之间,最好使用哪一个?谢谢。
答案 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在派生类中处理事件的首选技术。