Что означает свойство страницы AutoEventWireUp? - PullRequest
48 голосов
/ 25 марта 2009

Я не понимаю, за что отвечает свойство страницы AutoEventWireUp.

Во время серфинга в сети я обнаружил множество форумов, на которых обсуждались эти вопросы, и все они мне кажутся противоречивыми.

Могу ли я получить четкое объяснение того, что именно означает это свойство?

Я прочитал эту статью , но даже этого я не понимаю.

Ответы [ 3 ]

57 голосов
/ 25 марта 2009

Когда запрашивается страница, она вызывает различные события, которые считаются частью ее жизненного цикла . Я держу под рукой визуальное представление , созданное Питером Бромбергом.

Свойство AutoEventWireUp при значении True автоматически подключает некоторые из этих встроенных событий в жизненном цикле страницы к их обработчикам. Это означает, что вам не нужно явно прикреплять эти события (используя ключевое слово Handles, например, в VB).

Примеры этих встроенных событий: Page_Init и Page_Load.

Если вы установите AutoEventWireUp в True и обеспечите явное подключение EventHandlers, вы обнаружите, что они выполняются дважды! Это одна из причин, почему Visual Studio по умолчанию сохраняет этот атрибут равным false.

Редактировать: (после комментария Chester89)


Полезно отметить, что значением по умолчанию атрибута AutoEventWireUp страницы является true, тогда как значением по умолчанию свойства AutoEventWireUp класса Page является false

27 голосов
/ 25 марта 2009

Добавить к предыдущим ответам; автоматические крючки применяются от TemplateControl.HookUpAutomaticHandlers. Этот метод вызывает в TemplateControl.GetDelegateInformationWithNoAssert, который содержит, какие методы считаются обработчиками событий.

Это, в System.Web, версия 2.0:

  • На всех классах, производных от страницы: Page_PreInit, Page_PreLoad, Page_LoadComplete, Page_PreRenderComplete, Page_InitComplete, Page_SaveStateComplete.

  • На всех классах, производных от TemplateControl: Page_Init, Page_Load, Page_DataBind, Page_PreRender, Page_UnLoad, Page_Error .`

  • Поддержка транзакций для всех классов, производных от TemplateControl:

    • Page_AbortTransaction, или, если он не существует, OnTransactionAbort
    • Page_CommitTransaction, или, если он не существует, OnTransactionCommit

System.Web версии 4.0 представил Page_PreRenderCompleteAsync для всех классов, производных от Page. Этот метод, если он существует, будет зарегистрирован с использованием Page.RegisterAsyncTask и будет выполнен автоматически «непосредственно перед событием PreRenderComplete» (источник: Page.ExecuteRegisteredAsyncTasks ). Этот метод выглядит очень недокументированным, что говорит о том, что было бы предпочтительнее просто вызвать Page.RegisterAsyncTask с вашим собственным методом.

11 голосов
/ 25 марта 2009

Как упоминалось в статье, если у вас включена функция AutoEventWireUp, asp.net автоматически распознает, что у вас есть метод с синтаксисом page_load, и автоматически вызывает его:

private void Page_Load(object sender, System.EventArgs e)
{
}

Это дает вам более чистый код за счет некоторых (очень) небольших накладных расходов. Обратите внимание, что если вы не укажете его, вы должны явно указать asp.net, что вы хотите обработать событие загрузки страницы:

this.Load += new System.EventHandler(this.Page_Load);

Обратите внимание, что это применимо к другим событиям на странице, так как в нем используется соглашение об именах: Page_Event .

...