Modello di eventi dei controlli server Web ASP.NET
Aggiornamento: novembre 2007
ASP.NET offre un'importante funzionalità che consente di programmare pagine Web utilizzando un modello basato su eventi, analogo a quello disponibile nelle applicazioni client. A titolo di esempio, è possibile aggiungere un pulsante a una pagina Web ASP.NET e quindi scrivere un gestore eventi per l'evento click del pulsante. Sebbene sia un'operazione piuttosto comune nelle pagine Web che operano esclusivamente con script client (gestendo l'evento onclick del pulsante in HTML dinamico), ASP.NET aggiunge a questo modello l'elaborazione basata su server.
Gli eventi generati da controlli server ASP.NET presentano un funzionamento diverso rispetto agli eventi delle pagine HTML tradizionali o delle applicazioni Web basate su client. La differenza principale è rappresentata dalla separazione dell'evento stesso dalla posizione in cui l'evento viene gestito. Nelle applicazioni basate su client gli eventi vengono generati e gestiti sul client. Nelle pagine Web ASP.NET, tuttavia, gli eventi associati ai controlli server vengono generati sul client (browser) ma gestiti sul server Web dalla pagina ASP.NET.
Per gli eventi generati sul client, il modello di eventi dei controlli Web ASP.NET richiede che le informazioni sugli eventi vengano acquisite sul client e che un messaggio di evento venga trasmesso al server mediante un HTTP post. La pagina deve interpretare l'invio per determinare quale evento è stato generato e chiamare il metodo appropriato nel codice del server per gestire l'evento.
In ASP.NET sono gestite le attività di acquisizione, trasmissione e interpretazione degli eventi. In genere è possibile creare gestori eventi in una pagina Web ASP.NET senza preoccuparsi di come le informazioni sugli eventi vengano acquisite e rese disponibili al codice. È possibile invece creare i gestori eventi attenendosi alle stesse procedure eseguite in un form per applicazioni client tradizionali. È tuttavia necessario tenere presente alcuni aspetti della gestione degli eventi nelle pagine Web ASP.NET.
Gruppo di eventi per pagine e controlli server
Poiché la maggior parte degli eventi dei controlli server di ASP.NET richiede un percorso di andata e ritorno al server per l'elaborazione, tali eventi possono influenzare le prestazioni di una pagina. Pertanto, i controlli server offrono un insieme limitato di eventi, in genere i soli eventi click. Alcuni controlli server supportano gli eventi di modifica. Il controllo server Web CheckBox genera, ad esempio, un evento CheckedChanged nel codice server quando l'utente fa clic sulla casella. Alcuni controlli server supportano eventi più astratti. Ad esempio, il controllo server Web Calendar genera un evento SelectionChanged che rappresenta una versione più astratta di un evento click.
Gli eventi che si verificano di frequente e possono essere generati all'insaputa dell'utente, ad esempio un evento onmouseover, non sono supportati per i controlli server. I controlli server di ASP.NET sono comunque in grado di chiamare i gestori sul lato client per questi eventi, come illustrato in seguito nella sezione Modello di eventi dei controlli server Web ASP.NET.
I controlli e la pagina stessa possono generare eventi del ciclo di vita in ogni operazione di elaborazione, come Init, Load e PreRender. Tali eventi possono essere utilizzati nell'applicazione che si sta sviluppando. Nell'evento Load di una pagina, ad esempio, è possibile impostare valori predefiniti per i controlli.
Argomenti degli eventi
Gli eventi dei controlli e delle pagine ASP.NET basati sul server seguono un modello .NET Framework standard per i metodi dei gestori eventi. Tutti gli eventi passano due argomenti: un oggetto che rappresenta l'oggetto che ha generato l'evento e un oggetto evento contenente le eventuali informazioni relative agli eventi. Il secondo argomento è in genere di tipo EventArgs, ma per alcuni controlli assume il tipo specifico del controllo. Per un controllo server Web ImageButton, ad esempio, il secondo argomento è di tipo ImageClickEventArgs e include informazioni sulle coordinate del punto in cui l'utente ha fatto clic.
Nota: |
---|
Gli eventi per la pagina, come ad esempio l'evento Load, possono accettare i due argomenti standard, ma in essi non viene passato alcun valore. |
Eventi di postback e non postback nei controlli server
Nei controlli server determinati eventi, in genere gli eventi click, comportano il rinvio immediato della pagina al server. Gli eventi di modifica nei controlli server HTML e Web, come il controllo TextBox, non causano un invio immediato. Tali eventi vengono invece generati al successivo invio.
Nota: |
---|
Se tale comportamento è supportato dal browser, i controlli di convalida possono verificare l'input dell'utente utilizzando lo script client, senza effettuare un percorso di andata e ritorno al server. Per informazioni, vedere Convalida dell'input utente nelle pagine Web ASP.NET. |
Dopo che è stato eseguito il postback di una pagina, vengono generati i relativi eventi di inizializzazione (Page_Init e Page_Load) e successivamente gli eventi di controllo vengono elaborati. Si consiglia di non creare una logica dell'applicazione basata sull'ordine degli eventi di modifica generati, a meno che non si disponga di informazioni dettagliate sull'elaborazione degli eventi delle pagine. Per informazioni dettagliate, vedere Cenni preliminari sul ciclo di vita di una pagina ASP.NET.
Qualora sia utile per l'applicazione, è possibile specificare che gli eventi di modifica determinino l'invio della pagina. I controlli server Web che supportano un evento di modifica includono una proprietà AutoPostBack. Quando questa proprietà è impostata su true, l'evento di modifica del controllo causa l'invio immediato della pagina, senza attendere un evento click. Per impostazione predefinita, ad esempio, l'evento CheckedChanged di un controllo CheckBox non causa l'invio della pagina. Tuttavia, impostando la proprietà AutoPostBack del controllo su true, la pagina verrà inviata al server per l'elaborazione appena l'utente seleziona la casella di controllo.
Nota: |
---|
Affinché la proprietà AutoPostBack funzioni correttamente, è necessario che il browser dell'utente sia abilitato per l'esecuzione di script. Nella maggior parte dei browser lo script è attivato in base all'impostazione predefinita. Tuttavia alcuni utenti disattivano lo script per motivi di sicurezza. Per informazioni dettagliate, vedere Script client nelle pagine Web ASP.NET. |
Eventi inoltrati
I controlli server Web come Repeater, DataList, GridView, FormView e DetailsView possono contenere controlli pulsante che generano eventi. Ciascuna riga in un controllo GridView può ad esempio contenere uno o più pulsanti creati dinamicamente dai modelli.
Anziché far sì che ogni pulsante generi un evento singolarmente, gli eventi dei controlli nidificati vengono inoltrati al controllo contenitore. Il contenitore a sua volta genera un evento ItemCommand generico con parametri che consentono di identificare il singolo controllo che ha generato l'evento originale. Rispondendo a questo singolo evento, è possibile evitare la creazione di singoli gestori eventi per i controlli figlio.
L'evento ItemCommand include i due argomenti degli eventi standard, un oggetto che fa riferimento all'origine dell'evento e un oggetto evento contenente informazioni specifiche sull'evento.
Nota: |
---|
GridView, DataList e altri controlli dati supportano eventi aggiuntivi, quali EditCommand, DeleteCommand e UpdateCommand, che rappresentano casi speciali di eventi inoltrati. |
Con i pulsanti è possibile utilizzare la proprietà CommandArgument per passare una stringa specificata dall'utente al gestore eventi in modo da identificare il pulsante che ha generato l'evento. In un controllo DataList, ad esempio, i pulsanti generano l'evento ItemCommand. È possibile impostare la proprietà CommandArgument di ciascun pulsante su un valore differente, ad esempio un pulsante sul valore "ShowDetails" e un altro sul valore "AddToShoppingCart", quindi acquisire tali valori nel gestore eventi in un momento successivo.
Associazione di eventi a metodi
Un evento è un messaggio che informa che è stata eseguita un'azione, ad esempio è stato fatto clic su un pulsante. Nell'applicazione in uso il messaggio deve essere convertito in una chiamata al metodo nel codice. L'associazione tra il messaggio dell'evento e un metodo specifico, ovvero un gestore eventi, viene eseguita tramite un delegato dell'evento. Per ulteriori informazioni, vedere Eventi e delegati.
Nelle pagine Web ASP.NET non è necessario codificare esplicitamente i delegati se il controllo viene creato in modo dichiarativo (nel codice) sulla pagina. L'associazione di eventi può essere ottenuta in vari modi, in base all'evento da associare e al linguaggio di programmazione utilizzato. Per informazioni dettagliate, vedere Procedura: creare gestori eventi in pagine Web ASP.NET.
Associazione di eventi di controllo
Per i controlli dichiarati nella pagina, è possibile associare un evento a un metodo impostando un attributo (proprietà) nel codice del controllo. Nell'esempio di codice che segue è illustrato come sia possibile associare l'evento Click di un controllo Button ASP.NET a un metodo denominato ButtonClick.
<asp:button id="SampleButton"
text="Submit" onclick="ButtonClick" />
Quando la pagina viene compilata, in ASP.NET viene ricercato un metodo denominato ButtonClick e confermato che esso dispone della firma corretta (sono accettati due argomenti, uno di tipo Object e un altro di tipo EventArgs). Quindi, ASP.NET associa automaticamente l'evento al metodo.
In Visual Basic gli eventi vengono associati ai metodi mediante la parola chiave Handles nella dichiarazione del gestore eventi, come nell'esempio di codice seguente:
Private Sub ButtonClick(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles SampleButton.Click
Associazione di eventi di pagina
Le pagine ASP.NET generano eventi del ciclo di vita come Init, Load, PreRender e altri. Per impostazione predefinita, è possibile associare eventi di pagina a metodi utilizzando la convenzione di denominazione Page_eventname. Ad esempio, per creare un gestore per l'evento Load della pagina, è possibile creare un metodo denominato Page_Load. In fase di compilazione, ASP.NET individuerà i metodi basati su tale convenzione ed eseguirà automaticamente l'associazione tra evento e metodo. È possibile utilizzare la convenzione Page_eventname per qualsiasi evento esposto dalla classe Page.
Nota: |
---|
I metodi della gestione degli eventi della pagina non richiedono alcun argomento. |
Se lo si desidera, è possibile creare i gestori in modo esplicito. L'associazione automatica degli eventi di pagina in base alla convenzione di denominazione del metodo è controllata da una proprietà di pagina denominata AutoEventWireup. Per impostazione predefinita, la proprietà è impostata su true e ASP.NET esegue automaticamente la ricerca e l'associazione descritte precedentemente. In alternativa, è possibile impostare la proprietà su false aggiungendo l'attributo AutoEventWireup=false nella direttiva @ Page. È quindi possibile creare i metodi assegnando loro qualsiasi nome e associarli agli eventi di pagina in modo esplicito. In Visual Basic è possibile utilizzare la parola chiave Handles, come nell'esempio di codice seguente:
Sub MyPageLoad(sender As Object, e As EventArgs) Handles MyBase.Load
L'attributo AutoEventWireup presenta tuttavia lo svantaggio di richiedere che i gestori eventi di pagina siano identificati da nomi specifici e significativi. Questo limita la flessibilità dell'utente nella denominazione dei gestori di eventi.
Nota: |
---|
Se si include l'associazione esplicita per gli eventi della pagina, assicurarsi che la proprietà AutoEventWireup sia impostata su false in modo che il metodo non venga involontariamente chiamato due volte. |
Associazione esplicita per controlli dinamici
Se si creano controlli dichiarandoli nel tag, è possibile associare eventi a metodi utilizzando un attributo, ad esempio onclick, o in Visual Basic, utilizzando la parola chiave Handles. Se si creano i controlli dinamicamente (nel codice), non è possibile utilizzare questi metodi, in quanto il compilatore non dispone di un riferimento al controllo in fase di compilazione.
In questo caso, è quindi necessario utilizzare l'associazione eventi esplicita. In Visual Basic è possibile utilizzare l'istruzione AddHandler per associare un evento in un controllo creato in modo dinamico a un metodo esistente. In C#, si crea un delegato e lo si associa all'evento del controllo. Nell'esempio di codice riportato di seguito viene illustrato come associare un metodo denominato ButtonClick all'evento Click di un pulsante.
Dim b As New Button
b.Text = "Click"
AddHandler b.Click, AddressOf ButtonClick
Placeholder1.Controls.Add(b)
Button b = new Button;
b.Text = "Click";
b.Click += new System.EventHandler(ButtonClick);
Placeholder1.Controls.Add(b);
Risposta a eventi client e server nei controlli server ASP.NET
In questo argomento è stato illustrato come utilizzare eventi generati nel codice server. I controlli eseguono il rendering degli elementi nel browser, che possono anche generare eventi sul lato client che è possibile gestire nello script client. Utilizzando lo script client, è possibile aggiungere ai controlli server ASP.NET la gestione degli eventi relativi a mouse e tastiera. Per ulteriori informazioni, vedere Script client nelle pagine Web ASP.NET e Procedura: aggiungere eventi di script client ai controlli server Web ASP.NET.
Eventi a livello di applicazione e sessione
Oltre agli eventi di pagina e di controllo, in ASP.NET sono disponibili diversi modi per utilizzare eventi del ciclo di vita che vengono generati all'avvio o alla chiusura dell'applicazione o di una sessione utente, inclusi quelli riportati di seguito.
Gli eventi a livello di applicazione vengono generati per tutte le richieste passate a un'applicazione. L'evento BeginRequest dell'oggetto HttpApplication (Application_BeginRequest) viene generato quando è richiesta una pagina Web ASP.NET o un servizio Web XML nell'applicazione. Questo evento consente di inizializzare le risorse da utilizzare per ciascuna richiesta all'applicazione. Un evento corrispondente, l'evento EndRequest dell'oggettoHttpApplication (Application_EndRequest), consente di chiudere o in alternativa di eliminare le risorse utilizzate per la richiesta.
Gli eventi a livello di sessione sono simili agli eventi a livello di applicazione (sono disponibili gli eventi Start e End), ma vengono generati con ogni singola sessione all'interno dell'applicazione. Una sessione inizia quando un utente richiede una pagina per la prima volta all'applicazione e termina quando l'applicazione chiude in modo esplicito la sessione o quando si verifica il timeout della sessione.
Nota: L'evento Session_End non viene generato in tutti i casi. Per informazioni, vedere End.
È possibile creare i gestori per questi tipi di eventi nel file Global.asax. Per ulteriori informazioni, vedere Cenni preliminari sul ciclo di vita delle applicazioni ASP.NET per IIS 5.0 e 6.0 e Sintassi di Global.asax.
Vedere anche
Concetti
Cenni preliminari sulla gestione dello stato ASP.NET