2009-03-25 15 views
47

No entiendo por qué es responsable la propiedad de la página AutoEventWireUp.¿Qué significa la propiedad de la página AutoEventWireUp?

Mientras navego por la red, he encontrado muchos foros con discusiones al respecto y todos parecen discrepantes para mí.

¿Puedo obtener una explicación clara de lo que significa exactamente esta propiedad?

He leído this article, pero incluso eso no lo entiendo.

+0

¿Podría ser más específico sobre qué es exactamente lo que no entiende (en el artículo, por ejemplo)? – Cerebrus

+0

si lo entiendo bien, se menciona allí que el valor predeterminado para esa propiedad puede ser verdadero y puede ser falso, ¿qué es eso? – chester89

+0

¡Edité mi publicación para responder esa! ;-) – Cerebrus

Respuesta

51

Cuando se solicita una página, genera varios eventos que se consideran parte de su lifecycle. Guardo el visual representation creado por Peter Bromberg a mano conmigo.

La propiedad AutoEventWireUp cuando es verdadero, conecta automáticamente algunos de estos eventos incorporados en el ciclo de vida de la página a sus controladores. Esto significa que no necesita adjuntar explícitamente estos eventos (utilizando la palabra clave Handles, por ejemplo, en VB).

Ejemplos de estos eventos incorporados serían Page_Init y Page_Load.

Si configura AutoEventWireUp en True y proporcionan un cableado explícito de los manejadores de eventos, ¡verá que se ejecutan dos veces! Esta es una razón por la cual Visual Studio mantiene este atributo establecido en false de manera predeterminada.

Editar: (tras el comentario de Chester89)


Es útil señalar que el valor por defecto del atributo AutoEventWireUp de la página es true, mientras que el valor predeterminado de la propiedad AutoEventWireUp de la Página clase es false

+0

entonces, si para la clase de página es falso por defecto, expurgo que es falso por defalut también para la instancia de esta clase. ¿Es eso correcto? – chester89

+0

¡Muy bien! ;-) – Cerebrus

+0

pero la página es una instancia de la clase derivada de System.Web.UI.Page, por lo que este atributo no es heredable. – chester89

9

Como se menciona en el artículo, si usted tiene AutoEventWireup encendido, asp.net reconocerá automáticamente usted tiene un método Page_Load con la sintaxis y lo llaman de forma automática:

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

Esto le da un código más limpio detrás a expensas de algunos (muy) pequeños gastos generales. Tenga en cuenta que si no se especifica que se debe indicar explícitamente asp.net desea controlar el evento de carga de página:

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

Tenga en cuenta que esto se aplica a otros eventos en la página, ya que utiliza una convención de nombres como Página_Event.

+0

Esto no se aplica solo al método Page_Load. Otros métodos de gestión de eventos (por ejemplo, Page_Init, Page_PreRender, etc.) también se conectarán automáticamente si AutoEventWireUp está activado. – LukeH

+0

Solo fmoi: debe agregar el delegado a su lista de controladores de eventos de carga en un manejador de eventos anulado antes del evento de carga, p. OnInit o OnPreInit. Quizás aún mejor, puede agregar esa línea a un constructor vacío que anule el constructor de la página. – user420667

26

Para agregar a las respuestas anteriores; los ganchos automáticos se aplican desde TemplateControl.HookUpAutomaticHandlers. Este método llama al TemplateControl.GetDelegateInformationWithNoAssert que contiene qué métodos se consideran controladores de eventos.

Estos son, en System.Web, versión 2.0:

  • En todas las clases derivadas de Página: Page_PreInit, Page_PreLoad, Page_LoadComplete, Page_PreRenderComplete, Page_InitComplete, Page_SaveStateComplete.

  • En todas las clases derivadas de TemplateControl: Page_Init, Page_Load, Page_DataBind, Page_PreRender, Page_UnLoad, Page_Error .`

  • Soporte de transacciones para todas las clases derivadas de TemplateControl:

    • Page_AbortTransaction, o si no existe, OnTransactionAbort
    • Page_CommitTransaction, o si no existe, OnTransactionCommit

System.Web, versión 4.0, introdujo una Page_PreRenderCompleteAsync para todas las clases derivadas de página. Ese método, si está presente, se registrará usando Page.RegisterAsyncTask y se ejecutará automáticamente "justo antes del evento PreRenderComplete" (fuente: Page.ExecuteRegisteredAsyncTasks). Este método parece muy indocumentado, lo que sugiere que sería preferible simplemente llamar al Page.RegisterAsyncTask con su propio método.

+0

Interesante respuesta, Simon. Me gustan los detalles presentados y a veces puede ser difícil encontrar esta información. +1 – Cerebrus

Cuestiones relacionadas