2012-08-07 21 views
6

Si el atributo AutoEventWireup está establecido en false, los eventos se deben cablear manualmente. Sin embargo, no puedo hacer que el Page_PreInit se dispare. Supongo que podría estar haciendo que el cableado suceda demasiado tarde (una vez que ya hemos pasado el Page_PreInit), pero no estoy seguro de dónde colocar los cables.Cablear manualmente el evento Page_PreInit, con AutoEventWireup establecido en falso

Por ejemplo ...

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

protected void Page_PreInit(object sender, EventArgs e) 
{ 
    Response.Write("Page_PreInit event fired!<br>"); //this is never reached 
} 

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

el código anterior da como resultado "evento Page_Load despedido!" se muestra, pero nada de Page_PreInit. Intenté base.OnInit(e) antes y después de los cambios, y eso no tuvo ningún efecto.

El gráfico que se muestra here dice que el método OnInit en realidad viene después del evento PreInit. Con eso en mente, intenté sobreescribir OnPreInit y hacer lo mismo --- sin efecto.

El artículo de MSDN here dice claramente que en el caso de AutoEventWireup conjunto de false, los eventos pueden ser cableados en un overriden OnInit. El ejemplo que usan es Page_Load, y por supuesto que funciona igual que para mí, pero no abordan el hecho de que esto no parece funcionar para el evento Page_PreInit.

Mi pregunta es: ¿cómo puedo obtener el evento Page_PreInit cableada en el caso de AutoEventWireup establecido en false?

Entiendo que hay alternativas como las que figuran en el MSDN page, como el uso del constructor de la página. Me gustaría saber específicamente cómo hacer lo que sugieren con OnInit.

+0

Tienes que hacerlo en el constructor o antes de llamar a 'base.OnInit'. – Strelok

+0

Lamentablemente, colocar las líneas sobre base.OnInit (e) no tiene ningún efecto, y apuntar a un evento anterior (como OnPreInit) todavía no llegará al evento Page_PreInit. – CptSupermrkt

Respuesta

10

La implementación básica del método OnPreInit() es responsable de provocar el evento PreInit. Dado que su sobrescritura llama a esa implementación antes de registrando su controlador PreInit, de hecho no se llamará.

Trate de llamar a la clase base método después de registrar el manejador:

protected override void OnPreInit(EventArgs e) 
{ 
    PreInit += new EventHandler(Page_PreInit); 
    Load += new EventHandler(Page_Load); 

    // And only then: 
    base.OnPreInit(e); 
} 
+0

Sí, eso lo hizo. Gracias. – CptSupermrkt

+0

Debe tenerse en cuenta que este código anula 'OnPreInit' en lugar de' OnInit'. – Trisped

0

añadir todos los eventos en el área de inicialización:

public WebName() 
     { 
     this.event+=TAB Key 
     } 
Cuestiones relacionadas