Condividi tramite


Cenni preliminari sul ciclo di vita di una pagina ASP.NET

Aggiornamento: novembre 2007

In fase di esecuzione, una pagina ASP.NET attraversa un ciclo di vita in cui esegue una serie di fasi di elaborazione: tra le altre, inizializzazione, creazione di istanze di controlli, ripristino e mantenimento dello stato, esecuzione del codice del gestore eventi e rendering. Comprendere il ciclo di vita della pagina è importante per poter scrivere codice nella fase appropriata del ciclo di vita per ottenere l'effetto desiderato. Inoltre, se si sviluppano controlli personalizzati, è necessario acquisire familiarità con il ciclo di vita della pagina per inizializzare correttamente i controlli, popolare le proprietà dei controlli con i dati dello stato di visualizzazione ed eseguire qualsiasi codice comportamentale dei controlli. Il ciclo di vita di un controllo si basa sul ciclo di vita della pagina, ma quest'ultima genera un numero maggiore di eventi per un controllo rispetto a quello disponibile per una singola pagina ASP.NET.

Fasi di base del ciclo di vita di una pagina

In genere, la pagina attraversa le fasi illustrate nella tabella riportata di seguito Oltre alle fasi del ciclo di vita della pagina, prima e dopo una richiesta si verificano fasi dell'applicazione che non sono specifiche di una pagina. Per ulteriori informazioni, vedere Cenni preliminari sul ciclo di vita delle applicazioni ASP.NET per IIS 5.0 e 6.0.

Fase

Descrizione

Richiesta della pagina

La richiesta della pagina si verifica prima che inizi il ciclo di vita della pagina. Quando un utente richiede una pagina, ASP.NET determina se la pagina deve essere analizzata e compilata (avviando dunque il ciclo di vita della pagina) oppure se è possibile inviare in risposta una versione della pagina memorizzata nella cache senza eseguire la pagina stessa.

Avvio

Nella fase di avvio, vengono impostate le proprietà della pagina, quali Request e Response. In questa fase, la pagina determina anche se la richiesta è un postback o una nuova richiesta e imposta la proprietà IsPostBack. Inoltre, nel corso della fase di avvio, viene impostata anche la proprietà UICulture della pagina.

Inizializzazione della pagina

Durante l'inizializzazione della pagina, sono disponibili i controlli sulla pagina e viene impostata la proprietà UniqueID di ciascun controllo. Inoltre, viene eventualmente applicato alla pagina un tema. Se la richiesta corrente è un postback, i dati di postback non sono stati ancora caricati e i valori delle proprietà dei controlli non sono stati ancora ripristinati sui valori dello stato di visualizzazione.

Caricamento

Durante il caricamento, se la richiesta corrente è un postback, le proprietà dei controlli vengono caricate con le informazioni recuperate dallo stato di visualizzazione e dallo stato di controllo.

Convalida

Durante la fase di convalida, viene chiamato il metodo Validate di tutti i controlli di convalida, il quale imposta la proprietà IsValid dei singoli controlli di convalida e della pagina.

Gestione di eventi postback

Se la richiesta è un postback, viene chiamato qualsiasi gestore eventi.

Rendering

Prima di eseguire il rendering, la stato di visualizzazione viene salvato per la pagina e tutti i controlli. Durante la fase di rendering, la pagina chiama il metodo Render per ogni controllo, fornendo un writer di testo che scrive l'output in OutputStream della proprietà Response della pagina.

Scaricamento

Lo scaricamento viene chiamato dopo che è stato eseguito il rendering completo della pagina, la pagina è stata inviata al client ed è pronta per essere eliminata. In questa fase, vengono scaricate le proprietà della pagina, ad esempio Response e Request, e vengono eseguite le operazioni di pulitura.

Eventi del ciclo di vita

All'interno di ciascuna fase del ciclo di vita, la pagina genera eventi che è possibile gestire per eseguire codice personalizzato. Per gli eventi di controllo, è possibile associare il gestore eventi all'evento in modo dichiarativo, utilizzando attributi quali onclick, oppure in codice.

Le pagine supportano anche l'associazione automatica agli eventi, il che significa che ASP.NET ricerca metodi con determinati nomi e li esegue automaticamente quando vengono generati determinati eventi. Se l'attributo AutoEventWireup della direttiva @ Page è impostato su true (o non è definito, in quanto è impostato su true per impostazione predefinita), gli eventi della pagina verranno associati automaticamente ai metodi che utilizzano la convenzione di denominazione Page_event, ad esempio Page_Load e Page_Init. Per ulteriori informazioni sull'associazione automatica agli eventi, vedere Modello di eventi dei controlli server Web ASP.NET.

Nella tabella riportata di seguito vengono elencati gli eventi del ciclo di vita della pagina utilizzati più di frequente. Ci sono più eventi di quelli elencati, che tuttavia non vengono utilizzati nella maggior parte degli scenari di elaborazione della pagina. ma vengono utilizzate principalmente dai controlli server della pagina Web ASP.NET per inizializzare ed eseguire il rendering di se stessi. Se si desidera scrivere controlli server ASP.NET personalizzati, è necessario comprendere a fondo queste fasi. Per informazioni sulla creazione di controlli personalizzati, vedere Sviluppo di controlli server ASP.NET personalizzati.

Evento della pagina

Utilizzo tipico

PreInit

Utilizzare questo evento per:

  • Controllare la proprietà IsPostBack per determinare se la pagina viene elaborata per la prima volta.

  • Creare o ricreare controlli dinamici.

  • Impostare una pagina master in modo dinamico.

  • Impostare la proprietà Theme in modo dinamico.

  • Leggere o impostare i valori delle proprietà dei profili.

    Nota:
    Se la richiesta è un postback, i valori dei controlli non sono ancora stati ripristinati dallo stato di visualizzazione. Se in questa fase viene impostata una proprietà del controllo, il relativo valore potrebbe essere sovrascritto nell'evento successivo.

Init

Generato dopo che tutti i controlli sono stati inizializzati e che le impostazioni dell'interfaccia sono state applicate. Utilizzare questo evento per leggere o inizializzare le proprietà del controllo.

InitComplete

Generato dall'oggetto Page. Utilizzare questo evento per elaborare attività che richiedono il completamento di tutte le operazioni di inizializzazione.

PreLoad

Utilizzare questo evento se è necessario eseguire elaborazione nella pagina o nel controllo prima dell'evento Load.

Dopo che il controllo Page genera questo evento, carica lo stato di visualizzazione per sé e per tutti gli altri controlli e quindi elabora i dati del postback inclusi con l'istanza Request.

Load

Il controllo Page chiama il metodo dell'evento OnLoad nel controllo Page ed esegue quindi la stessa operazione in modo ricorsivo per ogni controllo figlio, che a sua volta esegue la stessa operazione per i propri controlli figlio finché la pagina e tutti i controlli non vengono caricati.

Utilizzare il metodo dell'evento OnLoad per impostare proprietà in controlli e stabilire le connessioni al database.

Eventi dei controlli

Utilizzare questi eventi per gestire eventi di controllo specifici, ad esempio l'evento Click di un controllo Button o l'evento TextChanged di un controllo TextBox.

Nota:
In una richiesta di postback, se la pagina contiene controlli di convalida, verificare la proprietà IsValid del controllo Page e dei singoli controlli di convalida prima di eseguire qualsiasi attività di elaborazione.

LoadComplete

Utilizzare questo evento per attività che richiedono che tutti gli altri controlli nella pagina siano caricati.

PreRender

Prima che si verifichi questo evento:

  • L'oggetto Page chiama EnsureChildControls per ogni controllo e per la pagina.

  • Ogni controllo con associazione a dati la cui proprietà DataSourceID è impostata chiama il metodo DataBind. Per ulteriori informazioni, vedere Eventi di associazione dati per controlli associati a dati nel presente argomento.

L'evento PreRender si verifica per ogni controllo nella pagina. Utilizzare l'evento per apportare modifiche finali al contenuto della pagina o ai controlli.

SaveStateComplete

Prima che si verifichi questo evento, ViewState è stato salvato per la pagina e per tutti i controlli. Qualsiasi modifica alla pagina o ai controlli verranno ignorati in questa fase.

Utilizzare questo evento per eseguire attività che richiedono il salvataggio dello stato di visualizzazione, ma che non apportano modifiche ai controlli.

Render

Questo non è un evento; in questa fase dell'elaborazione, l'oggetto Page chiama questo metodo in ogni controllo. Tutti i controlli server Web ASP.NET dispongono di un metodo Render che scrive il tag del controllo da inviare al browser.

Se si crea un controllo personalizzato, si esegue in genere l'override di questo metodo per restituire il tag del controllo. Tuttavia, se il controllo personalizzato incorpora solo controlli server Web ASP.NET standard e nessun tag personalizzato, non è necessario eseguire l'override del metodo Render. Per ulteriori informazioni, vedere Sviluppo di controlli server ASP.NET personalizzati.

Un controllo utente (un file con estensione ascx) incorpora automaticamente il rendering e non è pertanto necessario eseguire in modo esplicito il rendering del controllo nel codice.

Unload

Questo evento si verifica per ogni controllo e quindi per la pagina. Per i controlli, utilizzare questo evento per eseguire la pulitura finale di controlli specifici, ad esempio chiudendo connessioni al database specifiche di un controllo.

Per la pagina, utilizzare questo evento per eseguire la pulitura finale, ad esempio chiudendo connessioni al database e file aperti o terminando la registrazione o altre attività specifiche della richiesta.

Nota:
Durante la fase di scaricamento, è stato effettuato il rendering della pagina e dei relativi controlli. Pertanto, non è possibile apportare ulteriori modifiche al flusso di risposte. Se si cerca di chiamare un metodo, quale il metodo Response.Write, la pagina genererà un'eccezione.

Considerazioni aggiuntive sul ciclo di vita della pagina

I singoli controlli server ASP.NET hanno un ciclo di vita proprio che è simile al ciclo di vita della pagina. Ad esempio, gli eventi Init e Load di un controllo si verificano durante i corrispondenti eventi della pagina.

Nonostante gli eventi Init e Load si verifichino in modo ricorsivo in ogni controllo, si verificano in ordine inverso. L'evento Init (e anche l'evento Unload) per ogni controllo figlio si verifica prima che l'evento corrispondente sia generato per il contenitore (dal basso verso l'alto). Tuttavia, l'evento Load per un contenitore si verifica prima degli eventi Load dei relativi controlli figlio (dall'alto verso il basso).

È possibile personalizzare l'aspetto o il contenuto di un controllo gestendo gli eventi per il controllo, ad esempio l'evento Click per il controllo Button e l'evento SelectedIndexChanged per il controllo ListBox. In alcune circostanze, è possibile gestire anche l'evento DataBinding o DataBound di un controllo. Per ulteriori informazioni, vedere gli argomenti di riferimento alla classe dei singoli controlli e Sviluppo di controlli server ASP.NET personalizzati.

Quando si eredita una classe dalla classe Page, oltre a gestire gli eventi generati dalla pagina, è possibile eseguire l'override dei metodi dalla classe di base della pagina. Ad esempio, è possibile eseguire l'override del metodo InitializeCulture della pagina per impostare le informazioni relative alle impostazioni cultura in modo dinamico. Si noti che quando si crea un gestore eventi utilizzando la sintassi Page_event, l'implementazione di base viene chiamata in modo implicito e, pertanto, non è necessario chiamarla nel metodo personalizzato. Ad esempio, il metodo OnLoad della classe della pagina di base viene sempre chiamato, indipendentemente dal fatto che sia stato creato o meno un metodo Page_Load. Tuttavia, se si esegue l'override del metodo OnLoad della pagina con la parola chiave override (Overrides in Visual Basic), è necessario chiamare in modo esplicito il metodo di base. Ad esempio, se si esegue l'override del metodo OnLoad nella pagina, è necessario chiamare base.Load (MyBase.Load in Visual Basic) per consentire l'esecuzione dell'implementazione di base.

Aggiornamento degli eventi per i controlli aggiunti

Se i controlli vengono creati in modo dinamico in fase di esecuzione oppure in modo dichiarativo all'interno di modelli di controlli con associazione a dati, inizialmente gli eventi corrispondenti non sono sincronizzati con quelli degli altri controlli nella pagina. Ad esempio, per un controllo aggiunto in fase di esecuzione, gli eventi Init e Load si verificherebbero molto più avanti nel ciclo di vita della pagina rispetto agli stessi eventi per i controlli creati in modo dichiarativo. Pertanto, dal momento in cui ne viene creata l'istanza, i controlli aggiunti in modo dinamico e i controlli nei modelli generano gli eventi uno dopo l'altro finché non raggiungono l'evento durante il quale sono stati aggiunti all'insieme Controls.

In generale, non è necessario preoccuparsi di ciò a meno che non si disponga di controlli con associazione a dati nidificati. Se un controllo figlio è stato associato a dati, ma il controllo contenitore non è ancora stato associato a dati, i dati nel controllo figlio e i dati nel controllo contenitore corrispondente potrebbero non essere sincronizzati. Ciò è particolarmente vero se i dati nel controllo figlio eseguono l'elaborazione in base a un valore associato a dati nel controllo contenitore.

Ad esempio, si supponga di disporre di un controllo GridView che visualizza un record dell'azienda in ogni riga insieme a un elenco dei dipendenti dell'azienda in un controllo ListBox. Per compilare l'elenco di dipendenti, è necessario associare il controllo ListBox a un controllo origine dati (ad esempio SqlDataSource) che recupera i dati dei dipendenti dell'azienda utilizzando CompanyID in una query.

Se le proprietà di associazione a dati del controllo ListBox, ad esempio DataSourceID e DataMember, sono impostate in modo dichiarativo, il controllo ListBox tenterà di associarsi all'origine dati durante l'evento DataBinding della riga in cui è contenuto. Tuttavia, il campo CompanyID della riga non contiene un valore finché non si verifica l'evento RowDataBound del controllo GridView. In questo caso, il controllo figlio (il controllo ListBox) viene associato prima di associare il controllo che lo contiene (il controllo GridView). Ne risulta che le fasi di associazione a dati non sono sincronizzate.

Per evitare questa situazione, inserire il controllo origine dati per il controllo ListBox nello stesso elemento del modello del controllo ListBox stesso e non impostare in modo dichiarativo le proprietà di associazione a dati del controllo ListBox. Invece, impostarli a livello di codice in fase di esecuzione durante l'evento RowDataBound, in modo che il controllo ListBox non si associ ai dati finché le informazioni del campo CompanyID non sono disponibili.

Per ulteriori informazioni, vedere Associazioni a dati tramite un controllo origine dati.

Eventi di associazione a dati per i controlli con associazione a dati

Per capire meglio la relazione tra il ciclo di vita della pagina e gli eventi di associazione a dati, nella tabella riportata di seguito sono elencati gli eventi relativi ai dati nei controlli con associazione a dati, ad esempio i controlli GridView, DetailsView e FormView.

Evento del controllo

Utilizzo tipico

DataBinding

Questo evento viene generato dai controlli con associazione a dati prima dell'evento PreRender del controllo contenitore (o dell'oggetto Page) e definisce l'inizio dell'associazione del controllo ai dati.

Utilizzare questo evento per aprire manualmente le connessioni al database, se necessario. (Con i controlli origine dati questa operazione è spesso superflua.)

RowCreated (solo GridView) o ItemCreated (controlli DataList, DetailsView, SiteMapPath, DataGrid, FormView, Repeater e ListView)

Utilizzare questo evento per modificare contenuto che non dipende dall'associazione ai dati. In fase di esecuzione, è ad esempio possibile aggiungere a livello di codice formattazione a una riga di intestazione o piè di pagina in un controllo GridView.

RowDataBound (solo GridView) o ItemDataBound (controlli DataList, SiteMapPath, DataGrid, Repeater e ListView)

Quando si verifica questo evento, i dati sono disponibili nella riga o nell'elemento ed è pertanto possibile formattare i dati o impostare la proprietà FilterExpression nei controlli origine dati figlio per la visualizzazione di dati correlati all'interno della riga o dell'elemento.

DataBound

Questo evento definisce la fine delle operazioni di associazione a dati in un controllo con associazione a dati. In un controllo GridView l'associazione ai dati è completata per tutte le righe e tutti i controlli figlio.

Utilizzare questo evento per formattare il contenuto associato a dati o per avviare l'associazione ai dati in altri controlli che dipendono dai valori del contenuto del controllo corrente. (Per informazioni dettagliate, vedere "Aggiornamento degli eventi per i controlli aggiunti" più indietro in questo argomento.)

Eventi del controllo di accesso

Il controllo Login può utilizzare impostazioni nel file Web.config per gestire automaticamente l'autenticazione dell'appartenenza. Tuttavia, se l'applicazione in uso richiede la personalizzazione del funzionamento del controllo o si desidera capire la relazione tra gli eventi del controllo Login e il ciclo di vita della pagina, è possibile utilizzare gli eventi elencati nella tabella riportata di seguito.

Evento del controllo

Utilizzo tipico

LoggingIn

Questo evento viene generato durante un postback, dopo che si è verificato l'evento LoadComplete della pagina. Definisce l'inizio del processo di accesso.

Utilizzare questo evento per attività che devono verificarsi prima dell'inizio del processo di autenticazione.

Authenticate

Questo evento viene generato dopo l'evento LoggingIn.

Utilizzare questo evento per migliorare o eseguire l'override del comportamento di autenticazione predefinito di un controllo Login.

LoggedIn

Questo evento viene generato dopo che il nome utente e la password sono stati autenticati.

Utilizzare questo evento per reindirizzare a un'altra pagina o impostare in modo dinamico il testo nel controllo. Questo evento non si verifica se c'è un errore o se l'autenticazione ha esito negativo.

LoginError

Questo evento viene generato se l'autenticazione ha avuto esito negativo.

Utilizzare questo evento per impostare testo nel controllo che spiega il problema o per indirizzare l'utente a una pagina diversa.

Vedere anche

Concetti

Modello di eventi dei controlli server Web ASP.NET

Contesto di pagina e di applicazione nelle applicazioni Web ASP.NET

Cenni preliminari sullo stato di visualizzazione ASP.NET

Associazioni a dati tramite un controllo origine dati

Riferimenti

Convalida dell'input utente nelle pagine Web ASP.NET

Cenni preliminari sui controlli di accesso di ASP.NET

Altre risorse

Sviluppo di controlli server ASP.NET personalizzati

Sintassi di pagine ASP.NET

Gestione di eventi server in pagine Web ASP.NET