Eventi del ciclo di vita del client AJAX
Aggiornamento: novembre 2007
Una pagina ASP.NET con supporto AJAX genera gli stessi eventi del ciclo di vita del server di una pagina Web ASP.NET 2.0 oltre agli eventi del ciclo di vita del client. Gli eventi client consentono di personalizzare l'interfaccia utente per i postback e i postback asincroni (aggiornamenti a pagina parziale). Gli eventi client consentono inoltre di gestire componenti script personalizzati per la durata della pagina nel browser.
Gli eventi client sono generati da classi della Microsoft AJAX Library. Viene creata automaticamente un'istanza di tali classi quando una pagina contiene controlli del server AJAX ASP.NET. Le classi del client forniscono API che consentono di creare associazioni a eventi e fornire gestori per tali eventi. Poiché la Microsoft AJAX Library è indipendente dal browser, il codice scritto per i gestori funziona in modo simile in tutti i browser supportati.
L'evento principale per le richieste iniziali (richieste GET) e i postback sincroni è l'evento load dell'istanza Application. Quando si esegue lo script in un gestore dell'evento load, tutti gli script e i componenti sono stati caricati e sono disponibili. Quando è attivato il rendering a pagina parziale con controlli UpdatePanel, gli eventi client principali sono gli eventi della classe PageRequestManager. Tali eventi consentono di gestire molti scenari comuni, tra cui la possibilità di annullare postback, dare precedenza a un postback rispetto a un altro e animare controlli UpdatePanel quando il relativo contenuto viene aggiornato.
Gli eventi client sono utili durante la creazione di pagine o la scrittura di componenti. Uno sviluppatore di pagine può fornire uno script personalizzato che viene chiamato quando la pagina viene caricata e scaricata nel browser.
Per ulteriori informazioni sugli eventi del ciclo di vita del server, vedere Cenni preliminari sul ciclo di vita di una pagina ASP.NET.
Classi del client
Le due principali classi della Microsoft AJAX Library che generano eventi durante il ciclo di vita del client di una pagina Web AJAX ASP.NET sono Application e PageRequestManager.
Viene creata un'istanza della classe Application nel browser quando la pagina contiene un controllo ScriptManager. La classe Application è simile al controllo server Page, che deriva dalla classe Control, ma fornisce la funzionalità aggiuntive per la generazione di eventi del server. Analogamente, la classe Application deriva dalla classe Sys.Component, ma genera eventi del ciclo di vita del client che è possibile gestire.
Se una pagina contiene un controllo ScriptManager e uno o più controlli UpdatePanel, la pagina può eseguire aggiornamenti a pagina parziale se il rendering a pagina parziale è attivato e supportato nel browser. In questo caso un'istanza della classe PageRequestManager risulta automaticamente disponibile nel browser. La classe PageRequestManager genera eventi client specifici dei postback asincroni. Per informazioni dettagliate sul rendering a pagina parziale, vedere Cenni preliminari sul rendering a pagina parziale.
Aggiunta di gestori per eventi client
Per aggiungere o rimuovere gestori eventi generati dalle classi Application e PageRequestManager, utilizzare i metodi add_nomeevento e remove_nomeevento di tali classi. Nell'esempio seguente viene mostrato come aggiungere un gestore denominato MyLoad all'evento init dell'oggetto Application.
Sys.Application.add_init(MyInit);
function MyInit(sender) {
}
Sys.Appplication.remove_init(MyInit);
Sys.Application.add_init(MyInit);
function MyInit(sender) {
}
Sys.Appplication.remove_init(MyInit);
Nota: |
---|
Nell'esempio è illustrata solo la sintassi dei metodi add_nomeevento e remove_nomeevento. Per informazioni dettagliate sulle operazioni che è possibile eseguire con eventi specifici, vedere più avanti in questo argomento. |
Gestione di eventi load e unload di Application
Per gestire gli eventi load e unload dell'oggetto Application, non è necessario associare un gestore all'evento in modo esplicito. È invece possibile creare funzioni che utilizzano i nomi riservati pageLoad e pageUnload. Nell'esempio seguente viene mostrato come aggiungere un gestore eventi per l'evento load dell'oggetto Application utilizzando questo approccio.
function pageLoad(sender, args) {
}
function pageLoad(sender, args) {
}
Eventi per altre classi del client
In questo argomento vengono descritti solo gli eventi generati dalle classi Application e PageRequestManager. La Microsoft AJAX Library include anche classi per l'aggiunta, la cancellazione e la rimozione di gestori per gli eventi dell'elemento DOM. Tali classi includono:
Il metodo Sys.UI.DomEvent.addHandler o il metodo $addHandler del collegamento.
Il metodo Sys.UI.DomEvent.clearHandlers o il metodo $clearHandlers del collegamento.
Il metodo Sys.UI.DomEvent.removeHandler o il metodo $removeHandler del collegamento.
Gli eventi generati dagli elementi DOM non vengono trattati in questo argomento.
Eventi client delle classi Application e PageRequestManager
Nella tabella seguente sono elencati gli eventi client delle classi Application e PageRequestManager che è possibile gestire nelle pagine con supporto AJAX ASP.NET. L'ordine di generazione degli eventi è descritto più avanti in questo argomento.
Evento |
Descrizione |
---|---|
Generato dopo il caricamento di tutti gli script ma prima della creazione di eventuali oggetti. Se si sta scrivendo un componente, l'evento init fornisce un punto nel ciclo di vita per aggiungere il componente alla pagina. Il componente può quindi essere utilizzato in un secondo momento da altri componenti o da script nel ciclo di vita della pagina. Uno sviluppatore di pagine deve utilizzare l'evento load anziché l'evento init per la maggior parte degli scenari. L'evento init viene generato solo una volta durante il primo rendering della pagina. I successivi aggiornamenti a pagina parziale non generano l'evento init. |
|
Generato dopo il caricamento di tutti gli script e l'inizializzazione di tutti gli oggetti dell'applicazione creati utilizzando $create . L'evento load viene generato per tutti i postback al server, inclusi i postback asincroni. Uno sviluppatore di pagine può creare una funzione denominata pageLoadche fornisce automaticamente un gestore per l'evento load. Il gestore pageLoad viene chiamato dopo che eventuali gestori sono stati aggiunti all'evento load tramite il metodo add_load. L'evento load accetta un parametro eventargs, che corrisponde a un oggetto Sys.ApplicationLoadEventArgs. È possibile utilizzare gli argomenti dell'evento per determinare se la pagina viene aggiornata in seguito a un aggiornamento a pagina parziale e quali componenti sono stati creati dalla generazione del precedente evento load. |
|
Generato prima che tutti gli oggetti vengano eliminati e si verifichi l'evento window.unload della finestra del browser. Uno sviluppatore di pagine può creare una funzione denominata pageUnloadche fornisce automaticamente un gestore per l'evento unload. L'evento pageUnload viene chiamato poco prima che la pagina venga scaricata dal browser. Durante questo evento è necessario liberare eventuali risorse contenute nel codice. |
|
Potenzialmente generato quando una proprietà di un componente viene modificata. Questo evento viene generato solo se uno sviluppatore di componenti ha chiamato il metodo Sys.Component.raisePropertyChange in una funzione di accesso set della proprietà. Per ulteriori informazioni, vedere Definizione di proprietà del componente personalizzato e generazione di eventi PropertyChanged. L'evento propertyChanged accetta un parametro eventargs, che corrisponde a un oggetto Sys.applicationLoadEventArgs. |
|
Generato quando l'istanza Application viene eliminata. |
|
Generato prima dell'inizio di una richiesta asincrona. È possibile utilizzare questo evento per annullare un postback, ad esempio per dare precedenza a un altro postback asincrono. L'evento initializeRequest accetta un parametro eventargs, che corrisponde a un oggetto Sys.WebForms.InitializeRequestEventArgs. Questo oggetto rende disponibili l'elemento che ha causato il postback e l'oggetto della richiesta sottostante. InitializeRequestEventArgs espone inoltre una proprietà cancel. Se si imposta la proprietà cancel su true, il nuovo postback verrà annullato. |
|
Generato prima dell'inizio di un postback asincrono e dell'invio del postback al server. Se già presente, un postback in fase di elaborazione verrà arrestato utilizzando il metodo abortPostBack. È possibile utilizzare questo evento per impostare intestazioni di richiesta o avviare un'animazione nella pagina per indicare che la richiesta è in fase di elaborazione. L'evento beginRequest accetta un parametro eventargs, che corrisponde a un oggetto Sys.WebForms.BeginRequestEventArgs. Questo oggetto rende disponibili l'elemento che ha causato il postback e l'oggetto della richiesta sottostante. |
|
Generato dopo aver ricevuto la risposta dal server a un postback asincrono, ma prima dell'aggiornamento di eventuale contenuto nella pagina. È possibile utilizzare questo evento per specificare un effetto di transizione personalizzato per il contenuto aggiornato. L'evento pageLoading accetta un parametro eventargs, che corrisponde a un oggetto Sys.WebForms.PageLoadingEventArgs. Questo oggetto rende disponibili informazioni su quali pannelli verranno eliminati e aggiornati in seguito al più recente postback asincrono. |
|
Generato dopo l'aggiornamento di tutto il contenuto nella pagina in seguito a un postback sincrono o asincrono. Per i postback sincroni i pannelli possono solo essere creati, mentre per i postback asincroni i pannelli possono essere creati e aggiornati. È possibile utilizzare questo evento per gestire un effetto di transizione personalizzato per il contenuto aggiornato. L'evento pageLoaded accetta un parametro eventargs, che corrisponde a un oggetto Sys.WebForms.PageLoadedEventArgs. Questo oggetto rende disponibili informazioni su quali pannelli sono stati aggiornati e creati durante il più recente postback. |
|
Generato dopo la risposta relativa all'elaborazione di un postback asincrono e l'aggiornamento della pagina aggiornata o durante l'elaborazione della risposta in caso di errore. Se si verifica un errore, la pagina non verrà aggiornata. Utilizzare questo evento per fornire una notifica dell'errore personalizzata agli utenti oppure per registrare gli errori. L'evento endRequest accetta un parametro eventargs, che corrisponde a un oggetto Sys.WebForms.EndRequestEventArgs. Questo oggetto rende disponibili informazioni sugli errori che si sono verificati e indica se l'errore è stato gestito. Rende inoltre disponibile l'oggetto della risposta. |
Esempio di ordine degli eventi
Nell'esempio seguente sono illustrati gli eventi client generati in una pagina che comprende due controlli UpdatePanel, l'uno nidificato all'interno dell'altro. Si noterà una differenza se si fa clic sul pulsante nel pannello padre e se si fa clic sul pulsante nel pannello nidificato. La selezione del pulsante nel pannello padre implica l'aggiornamento del pannello padre e l'eliminazione e la ricreazione del pannello nidificato. La selezione del pulsante nel pannello nidificato implica invece solo l'aggiornamento del pannello nidificato.
<%@ Page Language="VB" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script >
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head >
<title>Client Event Example</title>
<style type="text/css">
#OuterPanel { width: 600px; height: 200px; border: 2px solid blue; }
#NestedPanel { width: 596px; height: 60px; border: 2px solid green;
margin-left:5 px; margin-right:5px; margin-bottom:5px;}
</style>
</head>
<body>
<form id="form1" >
<div>
<asp:ScriptManager ID="ScriptManager1" >
<Scripts>
<asp:ScriptReference Path="ClientEventTest.js" />
</Scripts>
</asp:ScriptManager>
<asp:UpdatePanel ID="OuterPanel" UpdateMode="Conditional" >
<ContentTemplate>
Postbacks from inside the outer panel and inner panel are
asynchronous postbacks. PRM = Sys.WebForms.PageRequestManager. APP = Sys.Application.
<br /><br />
<asp:Button ID="OPButton1" Text="Outer Panel Button" />
Last updated on
<%= DateTime.Now.ToString() %>
<br /><br />
<asp:UpdatePanel ID="NestedPanel" UpdateMode="Conditional" >
<ContentTemplate>
<asp:Button ID="NPButton1" Text="Nested Panel 1 Button" />
Last updated on
<%= DateTime.Now.ToString() %>
<br />
</ContentTemplate>
</asp:UpdatePanel>
</ContentTemplate>
</asp:UpdatePanel>
<input type="button" onclick="Clear();" value="Clear" />
<asp:Button ID="FullPostBack" Text="Full Postback" />
<a href="https://www.microsoft.com">Test Window Unload</a>
<br />
<span id="ClientEvents"></span>
</div>
</form>
</body>
</html>
<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script >
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head >
<title>Client Event Example</title>
<style type="text/css">
#OuterPanel { width: 600px; height: 200px; border: 2px solid blue; }
#NestedPanel { width: 596px; height: 60px; border: 2px solid green;
margin-left:5 px; margin-right:5px; margin-bottom:5px;}
</style>
</head>
<body>
<form id="form1" >
<div>
<asp:ScriptManager ID="ScriptManager1" >
<Scripts>
<asp:ScriptReference Path="ClientEventTest.js" />
</Scripts>
</asp:ScriptManager>
<asp:UpdatePanel ID="OuterPanel" UpdateMode="Conditional" >
<ContentTemplate>
Postbacks from inside the outer panel and inner panel are
asynchronous postbacks. PRM = Sys.WebForms.PageRequestManager. APP = Sys.Application.
<br /><br />
<asp:Button ID="OPButton1" Text="Outer Panel Button" />
Last updated on
<%= DateTime.Now.ToString() %>
<br /><br />
<asp:UpdatePanel ID="NestedPanel" UpdateMode="Conditional" >
<ContentTemplate>
<asp:Button ID="NPButton1" Text="Nested Panel 1 Button" />
Last updated on
<%= DateTime.Now.ToString() %>
<br />
</ContentTemplate>
</asp:UpdatePanel>
</ContentTemplate>
</asp:UpdatePanel>
<input type="button" onclick="Clear();" value="Clear" />
<asp:Button ID="FullPostBack" Text="Full Postback" />
<a href="https://www.microsoft.com">Test Window Unload</a>
<br />
<span id="ClientEvents"></span>
</div>
</form>
</body>
</html>
// Hook up Application event handlers.
var app = Sys.Application;
app.add_load(ApplicationLoad);
app.add_init(ApplicationInit);
app.add_disposing(ApplicationDisposing);
app.add_unload(ApplicationUnload);
// Application event handlers for component developers.
function ApplicationInit(sender) {
var prm = Sys.WebForms.PageRequestManager.getInstance();
if (!prm.get_isInAsyncPostBack())
{
prm.add_initializeRequest(InitializeRequest);
prm.add_beginRequest(BeginRequest);
prm.add_pageLoading(PageLoading);
prm.add_pageLoaded(PageLoaded);
prm.add_endRequest(EndRequest);
}
$get('ClientEvents').innerHTML += "APP:: Application init. <br/>";
}
function ApplicationLoad(sender, args) {
$get('ClientEvents').innerHTML += "APP:: Application load. ";
$get('ClientEvents').innerHTML += "(isPartialLoad = " + args.get_isPartialLoad() + ")<br/>";
}
function ApplicationUnload(sender) {
alert('APP:: Application unload.');
}
function ApplicationDisposing(sender) {
$get('ClientEvents').innerHTML += "APP:: Application disposing. <br/>";
}
// Application event handlers for page developers.
function pageLoad() {
$get('ClientEvents').innerHTML += "PAGE:: Load.<br/>";
}
function pageUnload() {
alert('Page:: Page unload.');
}
// PageRequestManager event handlers.
function InitializeRequest(sender, args) {
$get('ClientEvents').innerHTML += "<hr/>";
$get('ClientEvents').innerHTML += "PRM:: Initializing async request.<br/>";
}
function BeginRequest(sender, args) {
$get('ClientEvents').innerHTML += "PRM:: Begin processing async request.<br/>";
}
function PageLoading(sender, args) {
$get('ClientEvents').innerHTML += "PRM:: Loading results of async request.<br/>";
var updatedPanels = printArray("PanelsUpdating", args.get_panelsUpdating());
var deletedPanels = printArray("PanelsDeleting", args.get_panelsDeleting());
var message = "-->" + updatedPanels + "<br/>-->" + deletedPanels + "<br/>";
document.getElementById("ClientEvents").innerHTML += message;
}
function PageLoaded(sender, args) {
$get('ClientEvents').innerHTML += "PRM:: Finished loading results of async request.<br/>";
var updatedPanels = printArray("PanelsUpdated", args.get_panelsUpdated());
var createdPanels = printArray("PaneslCreated", args.get_panelsCreated());
var message = "-->" + updatedPanels + "<br/>-->" + createdPanels + "<br/>";
document.getElementById("ClientEvents").innerHTML += message;
}
function EndRequest(sender, args) {
$get('ClientEvents').innerHTML += "PRM:: End of async request.<br/>";
}
// Helper functions.
function Clear()
{
$get('ClientEvents').innerHTML = "";
}
function printArray(name, arr)
{
var panels = name + '=' + arr.length;
if(arr.length > 0)
{
panels += "(";
for(var i = 0; i < arr.length; i++)
{
panels += arr[i].id + ',';
}
panels = panels.substring(0, panels.length - 1);
panels += ")";
}
return panels;
}
// Hook up Application event handlers.
var app = Sys.Application;
app.add_load(ApplicationLoad);
app.add_init(ApplicationInit);
app.add_disposing(ApplicationDisposing);
app.add_unload(ApplicationUnload);
// Application event handlers for component developers.
function ApplicationInit(sender) {
var prm = Sys.WebForms.PageRequestManager.getInstance();
if (!prm.get_isInAsyncPostBack())
{
prm.add_initializeRequest(InitializeRequest);
prm.add_beginRequest(BeginRequest);
prm.add_pageLoading(PageLoading);
prm.add_pageLoaded(PageLoaded);
prm.add_endRequest(EndRequest);
}
$get('ClientEvents').innerHTML += "APP:: Application init. <br/>";
}
function ApplicationLoad(sender, args) {
$get('ClientEvents').innerHTML += "APP:: Application load. ";
$get('ClientEvents').innerHTML += "(isPartialLoad = " + args.get_isPartialLoad() + ")<br/>";
}
function ApplicationUnload(sender) {
alert('APP:: Application unload.');
}
function ApplicationDisposing(sender) {
$get('ClientEvents').innerHTML += "APP:: Application disposing. <br/>";
}
// Application event handlers for page developers.
function pageLoad() {
$get('ClientEvents').innerHTML += "PAGE:: Load.<br/>";
}
function pageUnload() {
alert('Page:: Page unload.');
}
// PageRequestManager event handlers.
function InitializeRequest(sender, args) {
$get('ClientEvents').innerHTML += "<hr/>";
$get('ClientEvents').innerHTML += "PRM:: Initializing async request.<br/>";
}
function BeginRequest(sender, args) {
$get('ClientEvents').innerHTML += "PRM:: Begin processing async request.<br/>";
}
function PageLoading(sender, args) {
$get('ClientEvents').innerHTML += "PRM:: Loading results of async request.<br/>";
var updatedPanels = printArray("PanelsUpdating", args.get_panelsUpdating());
var deletedPanels = printArray("PanelsDeleting", args.get_panelsDeleting());
var message = "-->" + updatedPanels + "<br/>-->" + deletedPanels + "<br/>";
document.getElementById("ClientEvents").innerHTML += message;
}
function PageLoaded(sender, args) {
$get('ClientEvents').innerHTML += "PRM:: Finished loading results of async request.<br/>";
var updatedPanels = printArray("PanelsUpdated", args.get_panelsUpdated());
var createdPanels = printArray("PaneslCreated", args.get_panelsCreated());
var message = "-->" + updatedPanels + "<br/>-->" + createdPanels + "<br/>";
document.getElementById("ClientEvents").innerHTML += message;
}
function EndRequest(sender, args) {
$get('ClientEvents').innerHTML += "PRM:: End of async request.<br/>";
}
// Helper functions.
function Clear()
{
$get('ClientEvents').innerHTML = "";
}
function printArray(name, arr)
{
var panels = name + '=' + arr.length;
if(arr.length > 0)
{
panels += "(";
for(var i = 0; i < arr.length; i++)
{
panels += arr[i].id + ',';
}
panels = panels.substring(0, panels.length - 1);
panels += ")";
}
return panels;
}
Ordine degli eventi per gli scenari comuni
L'ordine degli eventi dipende dai controlli utilizzati nella pagina e dal tipo di richiesta (richiesta iniziale, postback o postback asincrono). In questa sezione viene descritto l'ordine degli eventi per diversi scenari comuni.
Richiesta iniziale
Durante la richiesta iniziale della pagina viene generato un numero limitato di eventi client. Si presupponga lo scenario seguente per la richiesta iniziale:
La pagina contiene un controllo ScriptManager e le proprietà SupportsPartialRendering e EnablePartialRendering del controllo sono entrambe impostate su true.
La richiesta è una richiesta GET.
Viene restituita correttamente una risposta dal server.
Vengono generati gli eventi client seguenti nell'ordine riportato di seguito:
La richiesta iniziale viene inviata al server.
La risposta viene ricevuta dal client.
L'istanza Application genera l'evento init.
L'istanza Application genera l'evento load.
L'evento init dell'istanza Application viene generato soltanto una volta nella vita della pagina nel browser. Non viene generato per i postback asincroni successivi. Durante una richiesta iniziale non viene generato nessun evento PageRequestManager.
Postback asincrono
Un postback asincrono invia alcuni dati della pagina al server, riceve una risposta e aggiorna una parte della pagina. Si presupponga lo scenario seguente per un postback asincrono:
La pagina contiene un controllo ScriptManager e le proprietà SupportsPartialRendering e EnablePartialRendering del controllo sono entrambe impostate su true.
La pagina contiene un controllo UpdatePanel e la proprietà ChildrenAsTriggers del controllo è impostata su true.
Un pulsante nel controllo UpdatePanel avvia un postback asincrono.
Viene restituita correttamente una risposta dal server.
Vengono generati gli eventi client seguenti nell'ordine riportato di seguito:
Viene fatto clic sul pulsante nel controllo UpdatePanel e viene avviato un postback asincrono.
L'istanza PageRequestManager genera l'evento initializeRequest.
L'istanza PageRequestManager genera l'evento beginRequest.
La richiesta viene inviata al server.
La risposta viene ricevuta dal client.
L'istanza PageRequestManager genera l'evento pageLoading.
L'istanza PageRequestManager genera l'evento pageLoaded.
L'istanza Application genera l'evento load.
L'istanza PageRequestManager genera l'evento endRequest.
Per ulteriori informazioni, vedere Utilizzo di eventi PageRequestManager.
Si noti che l'evento load dell'istanza Application viene generato dopo l'evento PageRequestManagerpageLoaded e prima del relativo evento endRequest.
Postback asincroni multipli
Possono verificarsi postback asincroni multipli quando gli utenti avviano una nuova richiesta prima che sia terminata l'elaborazione della richiesta avviata in precedenza nel server o nel browser. Si presupponga lo scenario seguente per postback asincroni multipli:
La pagina contiene un controllo ScriptManager e le proprietà SupportsPartialRendering e EnablePartialRendering del controllo sono entrambe impostate su true.
La pagina contiene un controllo UpdatePanel.
Viene fatto clic due volte su un pulsante nel controllo UpdatePanel che avvia un postback asincrono. Al secondo clic il server elabora la richiesta avviata dal primo clic.
Viene restituita correttamente dal server una risposta alla prima richiesta.
Vengono generati gli eventi client seguenti nell'ordine riportato di seguito:
Viene fatto clic su un pulsante nel controllo UpdatePanel e viene avviato un postback asincrono.
L'istanza PageRequestManager genera l'evento initializeRequest.
L'istanza PageRequestManager genera l'evento beginRequest.
La richiesta viene inviata al server.
Viene fatto clic nuovamente sul pulsante e viene avviato un secondo postback asincrono.
L'istanza PageRequestManager genera l'evento initializeRequest al secondo clic sul pulsante.
L'istanza PageRequestManager genera l'evento endRequest al primo clic sul pulsante.
L'istanza PageRequestManager genera l'evento beginRequest al secondo clic sul pulsante.
La richiesta avviata dal secondo clic viene inviata al server.
La risposta viene ricevuta al secondo clic.
L'istanza PageRequestManager genera l'evento pageLoading.
L'istanza PageRequestManager genera l'evento pageLoaded.
L'istanza Application genera l'evento load.
L'istanza PageRequestManager genera l'evento endRequest.
Per impostazione predefinita, il postback asincrono più recente ha la precedenza. Se si verificano due postback asincroni in sequenza e il primo postback è ancora in fase di elaborazione nel browser, il primo postback verrà annullato. Se il primo postback è stato inviato al server, il server elaborerà la seconda richiesta arrivata e non restituirà la prima richiesta. Per informazioni su come dare precedenza a un postback asincrono specifico, vedere Assegnazione della precedenza a un postback asincrono specifico.
Uscita da una pagina
Quando l'utente esce da una pagina, la pagina corrente viene scaricata dal browser ed è possibile gestire l'evento unload per liberare risorse. Si presupponga lo scenario seguente per uscire da una pagina:
La pagina contiene un controllo ScriptManager e le proprietà SupportsPartialRendering e EnablePartialRendering del controllo sono entrambe impostate su true.
La pagina di destinazione è disponibile.
Vengono generati gli eventi client seguenti nell'ordine riportato di seguito:
Viene avviata la richiesta di una nuova pagina.
La risposta relativa alla nuova pagina viene ricevuta dal browser.
L'istanza Application genera l'evento unload.
Viene visualizzata la nuova pagina.
In caso di errore nella richiesta relativa alla nuova pagina, l'evento unload verrà generato ma la nuova pagina non verrà visualizzata.
Vedere anche
Concetti
Cenni preliminari sul ciclo di vita di una pagina ASP.NET
Definizione di proprietà del componente personalizzato e generazione di eventi PropertyChanged