2009-09-29 16 views
18

Page_Load no es un método virtual. ¿Qué llama a este método y cómo lo hace? ¿Es reflejo o alguna otra técnica? ¿También cuántos eventos se manejan de esta manera?¿Qué llama a Page_Load y cómo lo hace?

¿También es preferible manejar cosas en OnLoad o Page_Load sobrecargados? ¿En qué se diferencian?

Respuesta

21

ASP.NET tiene una característica llamada "AutoEventWireup" - esta característica le permite crear métodos que tienen la firma EventHandler con nombres como Page_Load y el tiempo de ejecución será de cable hasta el evento desde la página principal con el método en su clase. Básicamente, el tiempo de ejecución hace esto en su nombre:

this.Load += this.Page_Load; 

Ahora bien, es mejor desactivar AutoEventWireup y, o bien crear estos controladores de eventos en el mismo método de páginas OnInit o simplemente reemplazar el método de la página principal OnLoad.

Editar (en respuesta al comentario de OP a continuación): Este proceso no cubre los clics de botón pero el proceso es similar.

Para que un método como MyButton_Click a trabajar sin que crear explícitamente un controlador de eventos que tendría que establecer el atributo OnClick en el control en el archivo aspx como esto:

<asp:button 
    id="MyButton" 
    onClick="MyButton_Click" 
    runat="server" /> 

ello se estimularía ASP. NET para crear el botón haga clic en delegar para usted y adjúntelo al evento Click del botón.

+0

¿Esto también cubre los controles con ID? ¿Podría escribir MyButton_Click? –

+0

¿Por qué la recomendación de deshabilitar AutoEventWireup? – M4N

+0

@Martin: la generación de delegados para el cableado ocurre en el momento de la ejecución y es más lenta que simplemente anular un método. @Orion: no cubre los clics de los botones, pero el proceso es similar.Para que un método como 'MyButton_Click' funcione sin que usted cree explícitamente un controlador de eventos, deberá establecer el atributo' OnClick' en el control en un archivo aspx como este: 'OnClick =" MyButton_Click "'. Esto haría que ASP.NET cree el botón haga clic en delegar para usted y lo agregue al evento 'Click' del botón. –

1

Eche un vistazo a ASP.NET page lifecycle, hay una sección para los eventos del ciclo de vida donde describe la carga.

carga
La página llama al evento OnLoad método en la página, a continuación, de forma recursiva hace lo mismo para cada control secundario, que hace lo mismo para cada uno de sus controles secundarios hasta la página y todos los controles están cargados. Utilice el método de evento OnLoad para establecer las propiedades en los controles y establecer las conexiones de la base de datos .

Además Cita:

Tenga en cuenta que al crear un controlador de eventos utilizando la sintaxis Page_event, la implementación base es implícitamente llama y por lo tanto no es necesario llamarlo en su método. Para el ejemplo , siempre se llama al método OnLoad de la clase de la página base, ya sea que cree un método Page_Load o no. Sin embargo, si reemplaza la página Método OnLoad con la palabra clave (reemplaza en Visual Basic), , debe llamar explícitamente al método base . Por ejemplo, si sobrescribe el método OnLoad en la página, debe llamar a base.Load (MyBase.Load en Visual Basic) para que se ejecute la implementación base .

+0

Es curioso cómo tener que hacer burbujas en el evento explícitamente siempre se considera innecesario, propenso a errores y tedioso. Algunas personas podrían argumentar que invalidar OnLoad (y llamar a base.OnLoad) agrega seguridad y claridad en tiempo de compilación a la aplicación. :) – bzlm

4

El orden en que se llaman los métodos virtuales (proceso de carga) y controladores de eventos (Page_Load) se define por el denominado page lifecycle. Esta es solo la forma en que el tiempo de ejecución de ASP.NET procesa una solicitud entrante (por ejemplo, con las etapas Init, Load, Render).

Puede utilizar cualquiera OnLoad o Load pero hay que estar al tanto de lo que sucede:

  • dentro OnLoad debe llamar base.OnLoad
  • dentro base.OnLoad se ha producido el evento de carga
  • Page_Load es un controlador para el evento Load (que se conecta automáticamente) y, por lo tanto, se invocará como resultado del evento Load que se está generando.

Si no llama a base.OnLoad en su anulación OnLoad, entonces el evento Load no se activará.


Actualización: se puede usar una página en blanco con el siguiente código subyacente para ver lo que sucede:

protected override void OnInit(EventArgs e) 
{ 
    base.OnInit(e); 
    base.Load += new EventHandler(My_Page_Load); 
} 

void My_Page_Load(object sender, EventArgs e) 
{ 
    Response.Write("My_Page_Load<br/>"); 
} 

protected override void OnLoad(EventArgs e) 
{ 
    Response.Write("Start of OnLoad<br/>"); 
    base.OnLoad(e); 
    Response.Write("End of OnLoad<br/>"); 
} 

protected void Page_Load(object sender, EventArgs e) 
{ 
    Response.Write("Page_Load<br/>"); 
} 

Intente comentar la (e) llamada base.OnLoad y ver de nuevo.

1

En la directiva de página que dice: AutoEventWireup = "true"

Eso es lo que ocurre, su cable de forma automática hasta la carga de eventos ... (y algunos otros eventos como PreInit, inicio de descarga, etc.)

2

El método OnLoad en algún lugar de la jerarquía de páginas llama a los eventos asignados a Cargar (mediante + =).

El nombramiento de Page_Load es solo una convención. En el modo AutoEventWireUp (es decir, no se ha declarado explícitamente ningún controlador de eventos), esta convención se usa para buscar manejadores de eventos por sus nombres.

Si tiene .Net1 disponibles, se puede ver cómo el diseñador añade código para OnInit de la página() para agregar todos los componentes de la página y establezca

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

.NET2 todavía hace eso, pero de una archivo separado que está oculto en algún lugar bajo Windows \ Microsoft.Net \ Framework \ v * \ Temporal ASP.Net Files.

Encuentro this chart en ASP.Net Ciclo de vida de página muy útil.

Cuestiones relacionadas