Share via


Événements de cycle de vie client AJAX

Mise à jour : novembre 2007

Une page ASP.NET AJAX déclenche les mêmes événements de cycle de vie serveur qu'une page Web ASP.NET 2.0 et déclenche en outre des événements de cycle de vie client. Les événements clients vous permettent de personnaliser l'interface utilisateur pour les publications (postback) asynchrones (mises à jour partielles de pages) ou non. Les événements clients vous aident également à gérer des composants de script personnalisés pendant la durée de vie de la page dans le navigateur.

Les événements clients sont déclenchés par les classes de Microsoft AJAX Library. Ces classes sont instanciées automatiquement lorsqu'une page contient des contrôles serveur ASP.NET AJAX. Les classes clientes fournissent des API qui vous permettent de créer une liaison avec les événements et de fournir des gestionnaires pour ces événements. Microsoft AJAX Library étant indépendant du navigateur, le code que vous écrivez pour vos gestionnaires fonctionne de la même manière dans tous les navigateurs pris en charge.

L'événement de touche pour les requêtes initiales (requête GET) et les publications synchrones est l'événement load de l'instance Application. Lorsque le script d'un gestionnaire d'événements load est exécuté, tous les scripts et composants ont été chargés et sont disponibles. Lorsque le rendu de page partielle avec les contrôles UpdatePanel est activé, les événements de touche clients sont les événements de la classe PageRequestManager. Ces événements vous permettent de gérer de nombreux scénarios courants, notamment la possibilité d'annuler des publications, de donner la priorité à une publication par rapport à une autre et d'animer des contrôles UpdatePanel lorsque leur contenu est actualisé.

Les événements clients sont utiles pour créer des pages ou écrire des composants. Si vous développez des pages, vous pouvez fournir un script personnalisé appelé lors du chargement et du déchargement de la page dans le navigateur.

Pour plus d'informations sur les événements de cycle de vie serveur, consultez Vue d'ensemble du cycle de vie des pages ASP.NET.

Classes clientes

Les deux principales classes Microsoft AJAX Library qui déclenchent des événements pendant le cycle de vie client d'une page Web ASP.NET AJAX sont les classes Application et PageRequestManager.

La classe Application est instanciée dans le navigateur lorsque la page contient un contrôle ScriptManager. La classe Application ressemble au contrôle serveur Page dérivé de la classe Control mais fournit des fonctionnalités supplémentaires pour déclencher des événements serveur. De même, la classe Application dérive de la classe Sys.Component, mais déclenche des événements de cycle de vie client que vous pouvez gérer.

Si une page contient un contrôle ScriptManager et un ou plusieurs contrôles UpdatePanel, elle peut exécuter des mises à jour de pages partielles (si le rendu de page partielle est activé et pris en charge dans le navigateur). Dans ce cas, une instance de la classe PageRequestManager est automatiquement disponible dans le navigateur. La classe PageRequestManager déclenche des événements clients qui sont spécifiques aux publications asynchrones. Pour plus d'informations sur le rendu de page partielle, consultez Vue d'ensemble du rendu de page partielle.

Ajout de gestionnaires pour les événements clients

Pour ajouter ou supprimer des gestionnaires pour les événements déclenchés par les classes Application et PageRequestManager, utilisez les méthodes add_eventname et remove_eventname de ces classes. L'exemple suivant montre comment ajouter un gestionnaire MyLoad à l'événement init de l'objet 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);
Remarque :

Cet exemple indique uniquement la syntaxe des méthodes add_eventname et remove_eventname. La suite de cette rubrique aborde ce que vous pouvez faire avec les événements spécifiques.

Gestion des événements de chargement et déchargement d'application

Pour gérer les événements load et unload de l'objet Application, vous n'avez pas besoin de lier explicitement un gestionnaire à l'événement. À la place, vous pouvez créer des fonctions qui utilisent les noms réservés pageLoad et pageUnload. L'exemple suivant indique comment ajouter un gestionnaire pour l'événement load de l'objet Application en utilisant cette approche.

function pageLoad(sender, args) {
}
function pageLoad(sender, args) {
}

Événements pour d'autres classes clientes

Cette rubrique décrit uniquement les événements déclenchés par les classes Application et PageRequestManager. Microsoft AJAX Library contient également des classes permettant d'ajouter, effacer et supprimer des gestionnaires pour les événements d'élément DOM. Ces classes incluent :

Les événements déclenchés par les éléments DOM ne sont pas abordés dans cette rubrique.

Événements clients des classes Application et PageRequestManager

Le tableau suivant répertorie les événements clients des Application et classes PageRequestManager que vous pouvez gérer dans les pages ASP.NET AJAX. L'ordre dans lequel les événements sont déclenchés est décrit ultérieurement dans cette rubrique.

Événement

Description

Sys.Application.init, événement

Déclenché après que tous les scripts ont été chargés mais avant la création des objets. Si vous écrivez un composant, l'événement init vous donne un point dans le cycle de vie pour ajouter votre composant à la page. Le composant peut ensuite être utilisé ultérieurement par d'autres composants ou par un script dans le cycle de vie de la page. Si vous développez des pages, vous devez utiliser l'événement load au lieu de l'événement init pour la plupart des scénarios.

L'événement init est déclenché une seule fois lorsque lors du premier rendu de la page. Les mises à jour de pages partielles effectuées par la suite ne déclenchent pas l'événement init.

Sys.Application.load, événement

Déclenché après que tous les scripts ont été chargés et que tous les objets créés avec $create dans l'application sont initialisés. L'événement de load est déclenché pour toutes les publications sur le serveur, notamment les publications asynchrones.

Si vous développez des pages, vous pouvez créer une fonction nommée pageLoad afin de fournir automatiquement un gestionnaire pour l'événement load. Le gestionnaire pageLoad est appelé après les gestionnaires ajoutés à l'événement load par la méthode add_load.

L'événement de load prend un paramètre eventargs, qui est un objet Sys.ApplicationLoadEventArgs. Vous pouvez utiliser les arguments d'événement pour déterminer si la page est actualisée par suite d'une mise à jour de page partielle et les composants créés depuis le déclenchement du dernier événement load.

Sys.Application.unload, événement

Déclenché avant que tous les objets sont supprimés et avant l'événement window.unload de la fenêtre de navigateur.

Si vous développez des pages, vous pouvez créer une fonction nommée pageUnload afin de fournir automatiquement un gestionnaire pour l'événement unload. L'événement pageUnload est appelé juste avant que la page soit déchargée du navigateur. Pendant cet événement, vous devez libérer les ressources détenues par votre code.

Sys.Component.propertyChanged, événement

Potentiellement déclenché lorsqu'une propriété de composant change. Cet événement n'est déclenché que si un développeur de composants a appelé la méthode Sys.Component.raisePropertyChange dans un accesseur de jeu de propriétés. Pour plus d'informations, consultez Définition de propriétés de composants personnalisées et déclenchement d'événements PropertyChanged.

L'événement propertyChanged prend un paramètre eventargs, qui est un objet Sys.ApplicationLoadEventArgs.

Sys.Component.disposing, événement

Déclenché lorsque l'instance Application est supprimée.

initializeRequest, événement de Sys.WebForms.PageRequestManager

Déclenché avant le démarrage d'une requête asynchrone. Vous pouvez utiliser cet événement pour annuler une publication afin de donner la priorité à une autre publication asynchrone par exemple.

L'événement initializeRequest prend un paramètre eventargs, qui est un objet Sys.WebForms.InitializeRequestEventArgs. Cet objet rend disponibles l'élément qui a provoqué la publication et l'objet de requête sous-jacent. InitializeRequestEventArgs expose également une propriété cancel. Si vous affectez à cancel la valeur true, la nouvelle publication est annulée.

beginRequest, événement de Sys.WebForms.PageRequestManager

Déclenché avant le démarrage d'une publication asynchrone et l'envoi de la publication au serveur. Si une publication est déjà en cours de traitement, elle est arrêtée (à l'aide de la méthode abortPostBack ). Vous pouvez utiliser cet événement pour définir des en-têtes de requête ou lancer une animation sur la page pour indiquer que la requête est en cours.

L'événement beginRequest prend un paramètre eventargs, qui est un objet Sys.WebForms.BeginRequestEventArgs. Cet objet rend disponible l'élément qui a provoqué la publication et l'objet de requête sous-jacent.

pageLoading, événement de Sys.WebForms.PageRequestManager

Déclenché après la réception d'une réponse du serveur à une publication asynchrone, mais avant la mise à jour du contenu sur la page. Vous pouvez utiliser cet événement pour appliquer un effet de transition personnalisé au contenu mis à jour.

L'événement pageLoading prend un paramètre eventargs, qui est un objet Sys.WebForms.PageLoadingEventArgs. Cet objet fournit des informations à propos des panneaux qui vont être supprimés et mis à jour à la suite de la dernière publication asynchrone.

pageLoaded, événement de Sys.WebForms.PageRequestManager

Déclenché après avoir actualisé tout le contenu de la page à la suite d'une publication synchrone ou asynchrone. Pour les publications synchrones, les panneaux peuvent seulement être créés, mais pour les publications asynchrones, les panneaux peuvent être à la fois créés et mis à jour. Vous pouvez utiliser cet événement afin de gérer un effet de transition personnalisé pour le contenu mis à jour.

L'événement pageLoaded prend un paramètre eventargs, qui est un objet Sys.WebForms.PageLoadedEventArgs. Cet objet fournit des informations au sujet des panneaux qui ont été mis à jour et créés dans la dernière publication.

endRequest, événement de Sys.WebForms.PageRequestManager

Déclenché après le traitement de la réponse à une publication asynchrone et la mise à jour de la page, ou pendant le traitement de la réponse en présence d'une erreur. Si une erreur se produit, la page n'est pas mise à jour. Utilisez cet événement pour fournir une notification d'erreur personnalisée aux utilisateurs ou consigner les erreurs.

L'événement endRequest prend un paramètre eventargs, qui est un objet Sys.WebForms.EndRequestEventArgs. Cet objet fournit des informations à propos des erreurs qui se sont produites et de leur traitement. Il rend également l'objet de réponse disponible.

Exemple d'ordre des événements

L'exemple suivant affiche les événements clients déclenchés sur une page qui inclut deux contrôles UpdatePanel imbriqués l'un dans l'autre. Vous remarquerez une différence entre cliquer sur le bouton dans le panneau parent et cliquer sur le bouton dans le panneau imbriqué. Le bouton du panneau parent provoque la mise à jour du panneau parent et la suppression puis la recréation du panneau imbriqué. Le bouton du panneau imbriqué se contente de provoquer sa mise à jour.

<%@ 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;
}

Ordre des événements pour les scénarios courants

L'ordre des événements dépend des contrôles utilisés sur la page et du type de requête effectué (requête initiale, publication ou publication asynchrone). Cette section décrit l'ordre des événements pour plusieurs scénarios courants.

Requête initiale

Pendant la requête initiale de la page, un nombre limité d'événements clients est déclenché. Prenons le scénario suivant pour la requête initiale :

Les événements clients suivants se déroulent dans l'ordre indiqué :

  1. La requête initiale est envoyée au serveur.

  2. La réponse est reçue par le client.

  3. L'instance Application déclenche l'événement init.

  4. L'instance Application déclenche l'événement load.

L'événement init de l'instance Application est déclenché une seule fois pour la vie de la page dans le navigateur. Il n'est pas déclenché pour les publications asynchrones suivantes. Pendant une requête initiale, aucun événement PageRequestManager n'est déclenché.

Publication asynchrone

Une publication asynchrone envoie des données de page au serveur, reçoit une réponse et met à jour une partie de la page. Prenons le scénario suivant pour une publication asynchrone :

Les événements clients suivants se déroulent dans l'ordre indiqué :

  1. Le bouton à l'intérieur de UpdatePanel est cliqué pour lancer une publication asynchrone.

  2. L'instance PageRequestManager déclenche l'événement initializeRequest.

  3. L'instance PageRequestManager déclenche l'événement beginRequest.

  4. La requête est envoyée au serveur.

  5. La réponse est reçue par le client.

  6. L'instance PageRequestManager déclenche l'événement pageLoading.

  7. L'instance PageRequestManager déclenche l'événement pageLoaded.

  8. L'instance Application déclenche l'événement load.

  9. L'instance PageRequestManager déclenche l'événement endRequest.

Pour plus d'informations, consultez Utilisation d'événements PageRequestManager.

Notez que l'événement load de l'instance Application est déclenché après l'événement PageRequestManagerpageLoaded et avant l'événement endRequest.

Multiples publications asynchrones

De multiples publications asynchrones peuvent se produire lorsque les utilisateurs lancent une nouvelle requête alors que la précédente n'a pas encore été entièrement traitée sur le serveur ou dans le navigateur. Prenons le scénario suivant pour de multiples publications asynchrones :

  • La page contient un contrôle ScriptManager et les propriétés SupportsPartialRendering et EnablePartialRendering du contrôle ont toutes deux la valeur true.

  • La page contient un contrôle UpdatePanel.

  • Deux clics sont effectués sur un bouton à l'intérieur du contrôle UpdatePanel pour lancer une publication asynchrone. Le deuxième clic se produit pendant que le serveur traite la requête envoyée au premier clic.

  • Une réponse à la première requête est retournée avec succès par le serveur.

Les événements clients suivants se déroulent dans l'ordre indiqué :

  1. Un bouton à l'intérieur de UpdatePanel est cliqué pour lancer une publication asynchrone.

  2. L'instance PageRequestManager déclenche l'événement initializeRequest.

  3. L'instance PageRequestManager déclenche l'événement beginRequest.

  4. La requête est envoyée au serveur.

  5. Le bouton est cliqué une nouvelle fois pour envoyer une deuxième publication asynchrone.

  6. L'instance PageRequestManager déclenche l'événement initializeRequest pour le deuxième clic sur le bouton.

  7. L'instance PageRequestManager déclenche l'événement endRequest pour le premier clic sur le bouton.

  8. L'instance PageRequestManager déclenche l'événement beginRequest pour le deuxième clic sur le bouton.

  9. La requête lancée par le deuxième clic est envoyée au serveur.

  10. La réponse est reçue pour le deuxième clic.

  11. L'instance PageRequestManager déclenche l'événement pageLoading.

  12. L'instance PageRequestManager déclenche l'événement pageLoaded.

  13. L'instance Application déclenche l'événement load.

  14. L'instance PageRequestManager déclenche l'événement endRequest.

Par défaut, la dernière publication asynchrone a priorité. Si deux publications asynchrones se produisent tour à tour et que la première est encore en cours de traitement dans le navigateur, la première est annulée. Si la première publication a été envoyée au serveur, il traite la deuxième requête à son arrivée et ne revient pas à la première. Pour plus d'informations sur l'attribution d'une priorité à une publication asynchrone spécifique, consultez Accord de priorité à une publication (postback) asynchrone spécifique.

Sortie d'une page

Lorsque l'utilisateur sort d'une page, elle est déchargée du navigateur et vous pouvez gérer l'événement unload pour libérer les ressources. Prenons le scénario suivant pour sortir d'une page :

Les événements clients suivants sont déclenchés dans l'ordre indiqué :

  1. La requête de changement de page est lancée.

  2. Le navigateur reçoit la réponse pour la nouvelle page.

  3. L'instance Application déclenche l'événement unload.

  4. La nouvelle page s'affiche.

S'il y a une erreur dans la requête de changement de page, l'événement unload est déclenché, mais le changement de page n'apparaît pas.

Voir aussi

Concepts

Vue d'ensemble du cycle de vie des pages ASP.NET

Définition de propriétés de composants personnalisées et déclenchement d'événements PropertyChanged

Utilisation d'événements PageRequestManager

Création d'événements clients personnalisés