Между обработкой события Page_Init или переопределением метода OnInit страницы, какой из них лучше использовать? Благодарю.
Page_Init vs OnInit
Ответ 1
У меня был этот самый вопрос около года назад, я остановился на переопределении, а не на событиях On_X. Вот статья, которую я прочитал, охватывая плюсы и минусы: http://weblogs.asp.net/infinitiesloop/archive/2008/03/24/onload-vs-page-load-vs-load-event.aspx
Ответ 2
Переопределение метода базового типа предпочтительнее, поскольку виртуальный вызов проще и чище, чем создание делегата, связавшего событие с группой методов.
Кроме того, полагаясь на AutoEventWireup
, установленный на true
, вы указываете накладные расходы на разбор кода вашей страницы, поскольку ASP.NET должен будет создать для вас всех делегатов во время выполнения.
Ответ 3
В принципе, нет разницы в этих двух appoaches. Что сделано в 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);
}
}
}
Таким образом, в этих двух подходах нет разницы. Однако вам нужно вызвать base.OnInit в вашем методе overriden, если вы решите использовать переопределение вместо события. И еще одно отличие заключается в том, что если вы используете переопределение, вы можете запустить некоторый код сразу после применения темы.
С уважением.
P.S. Единственное, что я рекомендую, это использовать один и тот же подход во всем приложении.
Ответ 4
Здесь есть хороший ответ 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 не будет автоматически доступен.
Ответ 5
OnInit лучше, потому что он находится на инициализации уровня класса, в то время как инициация страницы может иметь избыточный эффект, потому что вы должны проверить, является ли это обратной передачей или нет.
Ответ 6
OnX, потому что в основном это предпочтительный метод обработки события в производном классе в соответствии с MSDN.