Eventos de ciclo de vida de cliente de AJAX

Actualización: noviembre 2007

Una página ASP.NET habilitada para AJAX provoca los mismos eventos de ciclo de vida de servidor que una página web de ASP.NET 2.0 y, además, provoca eventos de ciclo de vida de cliente. Los eventos de cliente permiten personalizar la interfaz de usuario tanto para devoluciones de datos como para devoluciones de datos asincrónicas (actualizaciones parciales de la página). Los eventos de cliente también ayudan a administrar los componentes de script personalizados mientras dure la página en el explorador.

Los eventos de cliente son provocados por las clases de Microsoft AJAX Library. Las instancias de estas clases se crean automáticamente cuando una página contiene controles de servidor de AJAX de ASP.NET. Las clases de cliente proporcionan API que permiten enlazar a los eventos y proporcionar controladores para esos eventos. Debido a que Microsoft AJAX Library es independiente del explorador, el código que escriba para sus controladores funcionará del mismo modo en todos los exploradores compatibles.

El evento clave para las solicitudes iniciales (solicitudes GET) y las devoluciones de datos sincrónicas es el evento load de la instancia de Application. Cuando se ejecuta un script en un controlador de eventos load, todos los scripts y componentes están cargados y disponibles. Cuando está habilitada una representación parcial de la página con controles UpdatePanel, los eventos de cliente clave son los eventos de la clase PageRequestManager. Estos eventos permiten administrar muchos escenarios habituales. Entre ellos, la posibilidad de cancelar devoluciones de datos, dar prioridad a una devolución de datos frente a otra y animar controles UpdatePanel cuando se actualiza su contenido.

Los eventos de cliente son útiles tanto para crear páginas como para escribir componentes. Los desarrolladores de páginas pueden incluir un script personalizado al que se llama cuando la página se carga y descarga en el explorador.

Para obtener más información acerca de los eventos de ciclo de vida de servidor, vea Información general sobre el ciclo de vida de una página ASP.NET.

Clases de cliente

Las dos clases principales de Microsoft AJAX Library que provocan eventos durante el ciclo de vida de cliente de una página web AJAX de ASP.NET son las clases Application y PageRequestManager.

La instancia de la clase Application se crea en el explorador cuando la página contiene un control ScriptManager. La clase Application es similar al control de servidor Page, que deriva de la clase Control, pero dispone de funcionalidad adicional para provocar eventos de servidor. De igual forma, la clase Application deriva de la clase Sys.Component, pero provoca eventos de ciclo de vida de cliente que se pueden administrar.

Si una página contiene un control ScriptManager y uno o varios controles UpdatePanel, la página puede realizar actualizaciones parciales (si está habilitada la representación parcial de la página y se admite en el explorador). En ese caso, una instancia de la clase PageRequestManager estará automáticamente disponible en el explorador. La clase PageRequestManager provoca eventos de cliente específicos de las devoluciones de datos asincrónicas. Para obtener más información sobre la representación parcial de páginas, vea Información general sobre la representación parcial de páginas.

Agregar controladores para eventos de cliente

Para agregar o quitar controladores para los eventos provocados por las clases Application y PageRequestManager, utilice los métodos add_nombre de evento y remove_nombre de evento de esas clases. En el ejemplo siguiente se muestra cómo agregar un controlador denominado MyLoad al evento init del objeto 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:

Este ejemplo muestra sólo la sintaxis de los métodos add_nombre de evento y remove_nombre de evento. Más adelante, en este tema, encontrará más información sobre lo que puede hacer con los eventos específicos.

Administrar los eventos Load y Unload de Application

Para administrar los eventos load y unload del objeto Application, no es necesario enlazar explícitamente un controlador al evento. En su lugar, puede crear funciones que utilizan los nombres reservados pageLoad y pageUnload. En el ejemplo siguiente se muestra cómo agregar un controlador para el evento load del objeto Application utilizando este enfoque.

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

Eventos para otras clases de cliente

En este tema se describen sólo los eventos provocados por las clases Application y PageRequestManager. Microsoft AJAX Library también dispone de clases para agregar, borrar y quitar controladores para los eventos de elementos DOM. Entre estas clases, se incluyen las siguientes:

En este tema no se tratan los eventos provocados por elementos DOM.

Eventos de cliente de las clases Application y PageRequestManager

En la tabla siguiente se enumeran los eventos de cliente de las clases Application y PageRequestManager que se pueden administrar en páginas habilitadas para ASP.NET AJAX. El orden en que se provocan los eventos se describe más adelante en este tema.

Evento

Descripción

Sys.Application.init (Evento)

Se provoca una vez cargados todos los scripts pero antes de que se cree ningún objeto. Si está escribiendo un componente, el evento init proporciona un punto del ciclo de vida para agregar el componente a la página. El componente puede ser utilizado por otros componentes o por scripts más tarde en el ciclo de vida de la página. Los desarrolladores de páginas deben utilizar el evento load en lugar del evento init para la mayoría de los escenarios.

El evento init sólo se provoca una vez cuando se representa la página por primera vez. Las posteriores actualizaciones parciales de la página no provocan el evento init.

Sys.Application.load (Evento)

Se provoca una vez cargados todos los scripts e inicializados todos los objetos de la aplicación creados mediante $create. El evento load se provoca para todas las devoluciones de datos al servidor, incluidas las devoluciones de datos asincrónicas.

Los desarrolladores de páginas pueden crear una función con el nombre pageLoad, que proporciona automáticamente un controlador para el evento load. Se llama al controlador pageLoad después de agregar los controladores al evento load mediante el método add_load.

El evento load toma un parámetro eventargs, que es un objeto Sys.ApplicationLoadEventArgs. Puede utilizar los argumentos del evento para determinar si la página se está actualizando como resultado de una actualización parcial de la página y qué componentes se han creado desde que se provocó el evento load anterior.

Sys.Application.unload (Evento)

Se provoca antes de eliminar todos los objetos y antes de que se produzca el evento window.unload de la ventana del explorador.

Los desarrolladores de páginas pueden crear una función con el nombre pageUnload, que proporciona automáticamente un controlador para el evento unload. Se llama al evento pageUnload justo antes de que la página se descargue del explorador. Durante este evento, debe liberar los recursos que su código esté almacenando.

Sys.Component.propertyChanged (Evento)

Podría provocarse al cambiar una propiedad de un componente. Este evento se provoca sólo si un programador de componentes ha llamado al método Sys.Component.raisePropertyChange en un descriptor de acceso set de la propiedad. Para obtener más información, vea Definir propiedades de componentes personalizados y provocar eventos PropertyChanged.

El evento propertyChanged toma un parámetro eventargs, que es un objeto Sys.applicationLoadEventArgs.

Sys.Component.disposing (Evento)

Se provoca cuando se elimina la instancia de Application.

Sys.WebForms.PageRequestManager initializeRequest (Evento)

Se provoca antes de que se inicie una solicitud asincrónica. Puede utilizar este evento para cancelar una devolución de datos, por ejemplo, para dar prioridad a otra devolución de datos asincrónica.

El evento initializeRequest toma un parámetro eventargs, que es un objeto Sys.WebForms.InitializeRequestEventArgs. Este objeto hace que esté disponible el elemento que produjo la devolución de datos y el objeto de solicitud subyacente. InitializeRequestEventArgs también expone una propiedad cancel. Si se establece cancel en true, la nueva devolución de datos se cancela.

Sys.WebForms.PageRequestManager beginRequest (Evento)

Se provoca antes de que se inicie una devolución de datos asincrónica y de que se envíe la devolución de datos al servidor. Si ya se está procesando una devolución de datos, se detiene (mediante el método abortPostBack ). Puede utilizar este evento para establecer los encabezados de la solicitud o comenzar una animación en la página para indicar que la solicitud está en proceso.

El evento beginRequest toma un parámetro eventargs, que es un objeto Sys.WebForms.BeginRequestEventArgs. Este objeto hace que esté disponible el elemento que produjo la devolución de datos y el objeto de solicitud subyacente.

Sys.WebForms.PageRequestManager pageLoading (Evento)

Se provoca después de recibir la respuesta del servidor a una devolución de datos asincrónica, pero antes de actualizar cualquier contenido en la página. Puede utilizar este evento para proporcionar un efecto de transición personalizado para el contenido actualizado.

El evento pageLoading toma un parámetro eventargs, que es un objeto Sys.WebForms.PageLoadingEventArgs. Este objeto hace que esté disponible la información acerca de qué paneles se eliminarán y actualizarán como resultado de la devolución de datos asincrónica más reciente.

Sys.WebForms.PageRequestManager pageLoaded (Evento)

Se provoca una vez actualizado todo el contenido de la página, como resultado de una devolución de datos sincrónica o asincrónica. Para las devoluciones de datos sincrónicas, los paneles sólo pueden crearse, pero para las devoluciones de datos asincrónicas, los paneles pueden crearse y actualizarse. Puede utilizar este evento para administrar un efecto de transición personalizado para el contenido actualizado.

El evento pageLoaded toma un parámetro eventargs, que es un objeto Sys.WebForms.PageLoadedEventArgs. Este objeto hace que esté disponible la información acerca de qué paneles se actualizaron y crearon en la devolución de datos más reciente.

Sys.WebForms.PageRequestManager endRequest (Evento)

Se provoca después de procesar la respuesta para una devolución de datos asincrónica y de actualizar la página, o durante el procesamiento de la respuesta en caso de error. Si se produce un error, la página no se actualiza. Utilice este evento para proporcionar una notificación de error personalizada a los usuarios o para registrar los errores.

El evento endRequest toma un parámetro eventargs, que es un objeto Sys.WebForms.EndRequestEventArgs. Este objeto hace que esté disponible la información acerca de los errores que se han producido y si se administraron los mismos. También hace que esté disponible el objeto de respuesta.

Ejemplo del orden de los eventos

En el ejemplo siguiente se muestran los eventos de cliente que se provocan en una página que incluye dos controles UpdatePanel, uno anidado en el otro. Observará una diferencia entre hacer clic en el botón del panel primario y hacer clic en el botón del panel anidado. El botón del panel primario hace que el panel primario se actualice y que el panel anidado se elimine y se vuelva a crear. El botón del panel anidado simplemente hace que el panel anidado se actualice.

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

Orden de los eventos para escenarios habituales

El orden de los eventos depende de qué controles se utilicen en la página y qué tipo de solicitud se realice (solicitud inicial, devolución de datos o devolución de datos asincrónica). En esta sección se describe el orden de los eventos para varios escenarios habituales.

Solicitud inicial

Durante la solicitud inicial de la página, se provoca un número limitado de eventos de cliente. Supongamos el escenario siguiente para la solicitud inicial:

Se producen los siguientes eventos de cliente, en este orden:

  1. La solicitud inicial se envía al servidor.

  2. El cliente recibe la respuesta.

  3. La instancia de Application provoca el evento init.

  4. La instancia de Application provoca el evento load.

El evento init de la instancia de Application se provoca sólo una vez mientras dura la página en el explorador. No se provoca para las devoluciones de datos asincrónicas posteriores. Durante una solicitud inicial, no se provoca ningún evento PageRequestManager.

Devolución de datos asincrónica

Una devolución de datos asincrónica envía algunos datos de la página al servidor, recibe una respuesta y actualiza una parte de la página. Supongamos el escenario siguiente para una devolución de datos asincrónica:

Se producen los siguientes eventos de cliente, en este orden:

  1. Se hace clic en el botón dentro de UpdatePanel que inicia una devolución de datos asincrónica.

  2. La instancia de PageRequestManager provoca el evento initializeRequest.

  3. La instancia de PageRequestManager provoca el evento beginRequest.

  4. La solicitud se envía al servidor.

  5. El cliente recibe la respuesta.

  6. La instancia de PageRequestManager provoca el evento pageLoading.

  7. La instancia de PageRequestManager provoca el evento pageLoaded.

  8. La instancia de Application provoca el evento load.

  9. La instancia de PageRequestManager provoca el evento endRequest.

Para obtener más información, vea Trabajar con eventos de PageRequestManager.

Observe que el evento load de la instancia de Application se provoca después del evento PageRequestManagerpageLoaded y antes de su evento endRequest.

Varias devoluciones de datos asincrónicas

Se pueden producir varias devoluciones de datos asincrónicas cuando los usuarios inician una nueva solicitud antes de que una solicitud iniciada anteriormente termine de procesarse en el servidor o en el explorador. Supongamos el escenario siguiente para varias devoluciones de datos asincrónicas:

  • La página contiene un control ScriptManager y tanto la propiedad SupportsPartialRendering del control como la propiedad EnablePartialRendering son true.

  • La página contiene un control UpdatePanel.

  • Se hace clic dos veces en un botón dentro del control UpdatePanel que inicia una devolución de datos asincrónica. El segundo clic se produce mientras el servidor está procesando la solicitud iniciada por el primer clic.

  • El servidor devuelve correctamente una respuesta a la primera solicitud.

Se producen los siguientes eventos de cliente, en este orden:

  1. Se hace clic en un botón dentro de UpdatePanel que inicia una devolución de datos asincrónica.

  2. La instancia de PageRequestManager provoca el evento initializeRequest.

  3. La instancia de PageRequestManager provoca el evento beginRequest.

  4. La solicitud se envía al servidor.

  5. Se hace clic de nuevo en el botón, que inicia una segunda devolución de datos asincrónica.

  6. La instancia de PageRequestManager provoca el evento initializeRequest para el segundo clic de botón.

  7. La instancia de PageRequestManager provoca el evento endRequest para el primer clic de botón.

  8. La instancia de PageRequestManager provoca el evento beginRequest para el segundo clic de botón.

  9. La solicitud iniciada por el segundo clic se envía al servidor.

  10. Se recibe la respuesta para el segundo clic.

  11. La instancia de PageRequestManager provoca el evento pageLoading.

  12. La instancia de PageRequestManager provoca el evento pageLoaded.

  13. La instancia de Application provoca el evento load.

  14. La instancia de PageRequestManager provoca el evento endRequest.

El comportamiento predeterminado de las devoluciones de datos asincrónicas es que la devolución de datos asincrónica más reciente tiene prioridad. Si se producen dos devoluciones de datos asincrónicas secuencialmente y la primera devolución de datos aún se está procesando en el explorador, ésta se cancela. Si se ha enviado la primera devolución de datos al servidor, el servidor procesa la segunda solicitud cuando llega y no devuelve la primera solicitud. Para obtener información sobre cómo dar prioridad a una devolución de datos asincrónica concreta, vea Dar prioridad a una devolución de datos asincrónica específica.

Cambiar de página en el explorador

Cuando el usuario cambia de página en el explorador, la página actual se descarga del explorador y puede administrar el evento unload para liberar recursos. Supongamos el escenario siguiente para cambiar de página en el explorador:

Se provocan los siguientes eventos de cliente, en este orden:

  1. Se inicia la solicitud de la nueva página.

  2. El explorador recibe la respuesta de la nueva página.

  3. La instancia de Application provoca el evento unload.

  4. Aparece la nueva página.

Si hay un error en la solicitud de la nueva página, se seguirá provocando el evento unload, pero no se mostrará la nueva página.

Vea también

Conceptos

Información general sobre el ciclo de vida de una página ASP.NET

Definir propiedades de componentes personalizados y provocar eventos PropertyChanged

Trabajar con eventos de PageRequestManager

Crear eventos de cliente personalizados