2012-08-07 5 views
6

Se l'attributo AutoEventWireup è impostato su false, gli eventi devono essere cablati manualmente. Tuttavia, non riesco a far sparare il Page_PreInit. Direi che potrei fare in modo che il collegamento avvenga troppo tardi (una volta che abbiamo già superato lo Page_PreInit), ma non sono sicuro di dove mettere i cavi.Cablaggio manuale dell'evento Page_PreInit, con AutoEventWireup impostato su false

Per esempio ...

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>"); 
} 

I risultati codice di cui sopra "Page_Load licenziato!" visualizzato, ma nulla da Page_PreInit. Ho provato base.OnInit(e) sia prima che dopo i collegamenti, e questo non ha avuto alcun effetto.

Il grafico mostrato here indica che il metodo OnInit arriva dopo l'evento PreInit. Con questo in mente, ho provato a sovrascrivere OnPreInit ea fare la stessa cosa --- nessun effetto.

L'articolo MSDN here dice esplicitamente che in caso di AutoEventWireup insieme ai false, gli eventi possono essere collegati in un sovresposta OnInit. L'esempio che usano è Page_Load e, naturalmente, funziona esattamente come fa per me, ma non risolve il problema per cui non sembra funzionare per l'evento Page_PreInit.

La mia domanda è: come posso ottenere l'evento Page_PreInit collegato in caso di AutoEventWireup impostato false?

Capisco che ci sono alternative come elencato su MSDN page, ad esempio utilizzando il costruttore della pagina. Mi piacerebbe sapere in particolare come fare come suggeriscono con OnInit.

+0

hai avuto modo di farlo nel costruttore o prima di chiamare 'base.OnInit'. – Strelok

+0

Sfortunatamente mettendo le righe sopra la base. OnInit (e) non ha alcun effetto e puntare a un evento precedente (come OnPreInit) non raggiungerà comunque l'evento Page_PreInit. – CptSupermrkt

risposta

10

L'implementazione di base del metodo OnPreInit() è responsabile dell'innalzamento dell'evento PreInit. Poiché l'override chiama l'implementazione prima del registrando il gestore PreInit, non verrà effettivamente chiamato.

Prova a chiamare la classe di base metodo dopo registrazione del gestore:

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

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

Proprio così. Grazie. – CptSupermrkt

+0

Si noti che questo codice sta eseguendo l'override di 'OnPreInit' invece di' OnInit'. – Trisped

0

aggiungere tutti gli eventi nella zona di inizializzazione:

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