Compartir a través de


Información general sobre la representación parcial de páginas

Actualización: noviembre 2007

La representación parcial de páginas elimina la necesidad de actualizar la página entera como resultado de una devolución de datos. En su lugar, sólo se actualizan las regiones concretas que han cambiado. Como resultado, la página no se vuelve a cargar completamente con cada devolución de datos, lo que agiliza en gran medida la interacción del usuario con la página web. ASP.NET permite agregar la representación parcial de páginas a las páginas web ASP.NET nuevas o existentes sin tener que escribir script de cliente.

Este tema contiene las siguientes secciones:

  • Escenarios

  • Características

  • Antecedentes

  • Ejemplos de código

  • Referencia de clase

Escenarios

Puede extender las aplicaciones ASP.NET existentes y desarrollar otras nuevas que incorporen la funcionalidad AJAX (Asynchronous JavaScript and XML). Utilice las características AJAX cuando desee conseguir lo siguiente:

  • Mejorar la experiencia del usuario con páginas web más enriquecidas, que son más receptivas a las acciones del usuario y presentan un comportamiento similar a las aplicaciones cliente tradicionales.

  • Reducir las actualizaciones de página completa y evitar el parpadeo de la página.

  • Habilitar la compatibilidad entre exploradores sin escribir script de cliente.

  • Llevar a cabo comunicaciones cliente-servidor de tipo AJAX sin escribir script de cliente.

  • Utilizar controles y componentes de ASP.NET AJAX Control Toolkit.

  • Desarrollar controles personalizados ASP.NET AJAX.

Características de la representación parcial de páginas

La representación parcial de páginas se basa en controles de servidor ASP.NET y en funciones de cliente de la Microsoft AJAX Library. No es preciso utilizar la Microsoft AJAX Library para habilitar la representación parcial de páginas, porque esta funcionalidad se proporciona automáticamente al utilizar los controles de servidor ASP.NET AJAX. Sin embargo, puede utilizar las API expuestas en la biblioteca de cliente para obtener funcionalidades AJAX adicionales.

Las principales características de ASP.NET que admiten la representación parcial de páginas son:

  • Un modelo declarativo que funciona como los controles de servidor ASP.NET. En muchos casos, puede especificar la representación parcial de la página utilizando únicamente el código de marcado declarativo.

  • Controles de servidor que realizan las tareas subyacentes necesarias para las actualizaciones parciales de páginas. Estos controles son ScriptManager y UpdatePanel.

  • Integración entre los controles de servidor ASP.NET AJAX y la Microsoft AJAX Library para las tareas comunes. Estas tareas incluyen permitir que un usuario cancele una devolución de datos, mostrar mensajes de progreso personalizados durante una devolución de datos asincrónica y determinar cómo se procesan las devoluciones de datos asincrónicas simultáneas.

  • Opciones de control de errores para la representación parcial de páginas, que permiten personalizar cómo se muestran los errores en el explorador.

  • Compatibilidad entre exploradores, integrada en la funcionalidad AJAX de ASP.NET. Al utilizar los controles de servidor, se invoca automáticamente la funcionalidad apropiada del explorador.

Antecedentes

Las páginas web típicas generadas con controles de servidor web ASP.NET realizan devoluciones de datos iniciadas por una acción del usuario en la página, como hacer clic en un botón. En la respuesta, el servidor representa una nueva página. Con frecuencia, al hacerlo se vuelven a representar controles y textos que no han cambiado entre la devolución de datos actual y la anterior.

Gracias a la representación parcial de páginas, es posible actualizar de forma asincrónica regiones individuales de la página y conseguir que sea más receptiva a las acciones del usuario. Puede implementar la representación parcial de páginas mediante controles de servidor web ASP.NET AJAX y, si lo desea, escribir script de cliente en el que se utilicen las API de la Microsoft AJAX Library.

Controles de servidor para actualizaciones parciales de páginas

Para agregar la funcionalidad de AJAX a las páginas web ASP.NET, debe identificar las secciones concretas de la página que desea actualizar. A continuación, se coloca el contenido de estas secciones en controles UpdatePanel. El contenido de un control UpdatePanel puede ser HTML u otros controles ASP.NET. Puede agregar un control UpdatePanel a la página de la misma manera que cualquier otro control. Por ejemplo, en Visual Studio puede arrastrarlo desde el cuadro de herramientas hasta la página web o agregarlo insertando código de marcado declarativo en la página. En el ejemplo siguiente se muestra el código de marcado de un control UpdatePanel:

<asp:UpdatePanel ID="UpdatePanel1" >
    <ContentTemplate>
        <!-- Place updatable markup and controls here. -->
    </ContentTemplate>
</asp:UpdatePanel>
<asp:UpdatePanel ID="UpdatePanel1" >
    <ContentTemplate>
        <!-- Place updatable markup and controls here. -->
    </ContentTemplate>
</asp:UpdatePanel>

De manera predeterminada, las devoluciones de datos que se originan automáticamente a partir de los controles contenidos en el panel de actualización (controles secundarios) inician, automáticamente, devoluciones de datos asincrónicas y dan lugar a una actualización parcial de la página. También puede especificar que los controles situados fuera del panel de actualización den lugar a una devolución de datos asincrónica y que actualicen el contenido del control UpdatePanel. Un control que produce una devolución de datos asincrónica se denomina desencadenador. Para obtener más información acerca de los desencadenadores, consulte Crear una página ASP.NET simple con varios controles UpdatePanel.

Una devolución de datos asincrónica se comporta de un modo muy parecido a una devolución de datos sincrónica. Tienen lugar todos los eventos de ciclo de vida de la página de servidor y se conservan los datos de formulario y el estado de la vista. Sin embargo, en la fase de representación, únicamente se envía al explorador el contenido del control UpdatePanel. El resto de la página permanece sin cambios.

Para admitir la representación parcial de páginas, debe colocar un control ScriptManager en ella. El control ScriptManager lleva la cuenta de todos los paneles de actualización de la página y de sus desencadenadores. Coordina el comportamiento de representación parcial de la página en el servidor y determina qué secciones de la página se representarán como resultado de una devolución de datos asincrónica.

En el ejemplo siguiente se muestra un control UpdatePanel cuyo contenido se actualiza cada vez que se origina una devolución de datos desde el interior del panel.

<%@ 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>Partial-Page Rendering Server-Side Syntax</title>
</head>
<body>
    <form id="form1" >
    <div>
      <asp:ScriptManager ID="ScriptManager1"  />
      <asp:UpdatePanel ID="UpdatePanel1" >
      <ContentTemplate>
        <fieldset>
        <legend>UpdatePanel</legend>
        Content to update incrementally without a full
        page refresh. 
        <br />
        Last update:  <%=DateTime.Now.ToString() %>
        <br />
        <asp:Calendar ID="Calendar" />
        </fieldset>
      </ContentTemplate>
      </asp:UpdatePanel>
      <script type="text/javascript" language="javascript">
      var prm = Sys.WebForms.PageRequestManager.getInstance();
      prm.add_pageLoaded(PageLoadedEventHandler);
      function PageLoadedEventHandler() {
         // custom script
      }
      </script>
    </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>Partial-Page Rendering Server-Side Syntax</title>
</head>
<body>
    <form id="form1" >
    <div>
      <asp:ScriptManager ID="ScriptManager1"  />
      <asp:UpdatePanel ID="UpdatePanel1" >
      <ContentTemplate>
        <fieldset>
        <legend>UpdatePanel</legend>
        Content to update incrementally without a full
        page refresh. 
        <br />
        Last update:  <%=DateTime.Now.ToString() %>
        <br />
        <asp:Calendar ID="Calendar" />
        </fieldset>
      </ContentTemplate>
      </asp:UpdatePanel>
      <script type="text/javascript" language="javascript">
      var prm = Sys.WebForms.PageRequestManager.getInstance();
      prm.add_pageLoaded(PageLoadedEventHandler);
      function PageLoadedEventHandler() {
         // custom script
      }
      </script>
    </div>
    </form>
</body>
</html>

Para obtener más ejemplos sobre el uso de los controles UpdatePanel para habilitar la representación parcial de la página, consulte los temas mostrados en la sección Ejemplos de código.

Utilizar script de cliente para las actualizaciones parciales de páginas

La clase PageRequestManager de ECMAScript (JavaScript) de la Microsoft AJAX Library admite actualizaciones parciales de páginas. Se ejecuta en el explorador para administrar la respuesta a las devoluciones de datos asincrónicas y actualizar el contenido en las regiones individuales. No tiene que hacer nada para habilitar esta funcionalidad. Se produce automáticamente al agregar uno o más controles UpdatePanel y un control ScriptManager a la página.

También puede utilizar JavaScript y la clase PageRequestManager para personalizar las actualizaciones parciales en una página. Por ejemplo, puede escribir script que dé prioridad a una devolución de datos asincrónica concreta si se produce más de una al mismo tiempo. También puede permitir que el usuario cancele las devoluciones de datos en curso.

En el ejemplo siguiente se muestra script de cliente que proporciona un controlador de eventos al que se llama cuando finaliza la carga de la página.

<script type="text/javascript" language="javascript">
var prm = Sys.WebForms.PageRequestManager.getInstance();
prm.add_pageLoaded(PageLoadedEventHandler);
function PageLoadedEventHandler() {
   // custom script
}
</script>
<script type="text/javascript" language="javascript">
var prm = Sys.WebForms.PageRequestManager.getInstance();
prm.add_pageLoaded(PageLoadedEventHandler);
function PageLoadedEventHandler() {
   // custom script
}
</script>

Para obtener más información sobre cómo utilizar la Microsoft AJAX Library para la representación parcial de páginas, consulte Trabajar con eventos de PageRequestManager y Información general sobre la clase PageRequestManager de ASP.NET.

Habilitar la compatibilidad con la representación parcial de páginas

Para habilitar o deshabilitar la representación parcial de una página se establece la propiedad EnablePartialRendering del control ScriptManager. También puede especificar si se admite la representación parcial para una página estableciendo la propiedad SupportsPartialRendering del control ScriptManager. Si no establece la propiedad SupportsPartialRendering y si la propiedad EnablePartialRendering es true (el valor predeterminado), se utilizan las funciones del explorador para determinar si se admite la representación parcial de la página.

Si la representación parcial de páginas no está habilitada para una página, si se ha deshabilitado o si no se admite en un explorador, la página utilizará el comportamiento de retroceso. En este caso, las acciones que normalmente realizarían una devolución de datos asincrónica llevan a cabo, en su lugar, una devolución de datos sincrónica y actualizan la página completa. Se omiten todos los controles UpdatePanel de la página y su contenido se representa como si no se encontrase dentro de un control UpdatePanel.

Nota:

Las páginas web ASP.NET que se configuran para la representación heredada no admiten la funcionalidad AJAX. Para obtener más información, consulte ASP.NET y XHTML.

Ejemplos de código

En el ejemplo siguiente se muestra la representación parcial de una página en acción. Existen dos controles UpdatePanel. Uno de ellos acepta los datos proporcionados por el usuario y el otro muestra un resumen de dichos datos.

<%@ Page Language="VB" %>
<%@ Import Namespace="System.Collections.Generic" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" >
    <title>Enter New Employees</title>
    <script >
        Private EmployeeList As List(Of Employee)

        Protected Sub Page_Load()
            If Not IsPostBack Then
                EmployeeList = New List(Of Employee)
                EmployeeList.Add(New Employee(1, "Jump", "Dan"))
                EmployeeList.Add(New Employee(2, "Kirwan", "Yvette"))
                ViewState("EmployeeList") = EmployeeList
            Else
                EmployeeList = CType(ViewState("EmployeeList"), List(Of Employee))
            End If

            EmployeesGridView.DataSource = EmployeeList
            EmployeesGridView.DataBind()
        End Sub

        Protected Sub InsertButton_Click(ByVal sender As Object, ByVal e As EventArgs)
            If String.IsNullOrEmpty(FirstNameTextBox.Text) Or _
               String.IsNullOrEmpty(LastNameTextBox.Text) Then Return

            Dim employeeID As Integer = EmployeeList(EmployeeList.Count - 1).EmployeeID + 1

            Dim lastName As String = Server.HtmlEncode(FirstNameTextBox.Text)
            Dim firstName As String = Server.HtmlEncode(LastNameTextBox.Text)

            FirstNameTextBox.Text = String.Empty
            LastNameTextBox.Text = String.Empty

            EmployeeList.Add(New Employee(employeeID, lastName, firstName))
            ViewState("EmployeeList") = EmployeeList

            EmployeesGridView.DataBind()
            EmployeesGridView.PageIndex = EmployeesGridView.PageCount
        End Sub

        Protected Sub CancelButton_Click(ByVal sender As Object, ByVal e As EventArgs)
            FirstNameTextBox.Text = String.Empty
            LastNameTextBox.Text = String.Empty
        End Sub

        <Serializable()> _
        Public Class Employee
            Private _employeeID As Integer
            Private _lastName As String
            Private _firstName As String

            Public ReadOnly Property EmployeeID() As Integer
                Get
                    Return _employeeID
                End Get
            End Property

            Public ReadOnly Property LastName() As String
                Get
                    Return _lastName
                End Get
            End Property

            Public ReadOnly Property FirstName() As String
                Get
                    Return _firstName
                End Get
            End Property

            Public Sub New(ByVal employeeID As Integer, ByVal lastName As String, ByVal firstName As String)
                _employeeID = employeeID
                _lastName = lastName
                _firstName = firstName
            End Sub
        End Class

    </script>
</head>
<body>
    <form id="form1" >
    <div>
        &nbsp;</div>
        <asp:ScriptManager ID="ScriptManager1"  EnablePartialRendering="true" />
        <table>
            <tr>
                <td style="height: 206px" valign="top">
                    <asp:UpdatePanel ID="InsertEmployeeUpdatePanel"  UpdateMode="Conditional">
                        <ContentTemplate>
                          <table cellpadding="2" border="0" style="background-color:#7C6F57">
                            <tr>
                              <td><asp:Label ID="FirstNameLabel"  AssociatedControlID="FirstNameTextBox" 
                                             Text="First Name" ForeColor="White" /></td>
                              <td><asp:TextBox  ID="FirstNameTextBox" /></td>
                            </tr>
                            <tr>
                              <td><asp:Label ID="LastNameLabel"  AssociatedControlID="LastNameTextBox" 
                                             Text="Last Name" ForeColor="White" /></td>
                              <td><asp:TextBox  ID="LastNameTextBox" /></td>
                            </tr>
                            <tr>
                              <td></td>
                              <td>
                                <asp:LinkButton ID="InsertButton"  Text="Insert" OnClick="InsertButton_Click" ForeColor="White" />
                                <asp:LinkButton ID="Cancelbutton"  Text="Cancel" OnClick="CancelButton_Click" ForeColor="White" />
                              </td>
                            </tr>
                          </table>
                          <asp:Label  ID="InputTimeLabel"><%=DateTime.Now %></asp:Label>
                        </ContentTemplate>
                    </asp:UpdatePanel>
                </td>
                <td style="height: 206px" valign="top">
                    <asp:UpdatePanel ID="EmployeesUpdatePanel"  UpdateMode="Conditional">
                        <ContentTemplate>
                            <asp:GridView ID="EmployeesGridView"  BackColor="LightGoldenrodYellow" BorderColor="Tan"
                                BorderWidth="1px" CellPadding="2" ForeColor="Black" GridLines="None" AutoGenerateColumns="False">
                                <FooterStyle BackColor="Tan" />
                                <SelectedRowStyle BackColor="DarkSlateBlue" ForeColor="GhostWhite" />
                                <PagerStyle BackColor="PaleGoldenrod" ForeColor="DarkSlateBlue" HorizontalAlign="Center" />
                                <HeaderStyle BackColor="Tan" Font-Bold="True" />
                                <AlternatingRowStyle BackColor="PaleGoldenrod" />
                                <Columns>
                                    <asp:BoundField DataField="EmployeeID" HeaderText="Employee ID" />
                                    <asp:BoundField DataField="LastName" HeaderText="Last Name" />
                                    <asp:BoundField DataField="FirstName" HeaderText="First Name" />
                                </Columns>
                                <PagerSettings PageButtonCount="5" />
                            </asp:GridView>
                            <asp:Label  ID="ListTimeLabel"><%=DateTime.Now %></asp:Label>
                        </ContentTemplate>
                        <Triggers>
                            <asp:AsyncPostBackTrigger ControlID="InsertButton" EventName="Click" />
                        </Triggers>
                    </asp:UpdatePanel>
                </td>
            </tr>
        </table>
    </form>
</body>
</html>
<%@ Page Language="C#" %>
<%@ Import Namespace="System.Collections.Generic" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head >
    <title>Enter New Employees</title>
    <script >
        private List<Employee> EmployeeList;

        protected void Page_Load()
        {
            if (!IsPostBack)
            {
                EmployeeList = new List<Employee>();
                EmployeeList.Add(new Employee(1, "Jump", "Dan"));
                EmployeeList.Add(new Employee(2, "Kirwan", "Yvette"));
                ViewState["EmployeeList"] = EmployeeList;
            }
            else
                EmployeeList = (List<Employee>)ViewState["EmployeeList"];

            EmployeesGridView.DataSource = EmployeeList;
            EmployeesGridView.DataBind();
        }

        protected void InsertButton_Click(object sender, EventArgs e)
        {
            if (String.IsNullOrEmpty(FirstNameTextBox.Text) ||
               String.IsNullOrEmpty(LastNameTextBox.Text)) { return; }

            int employeeID = EmployeeList[EmployeeList.Count-1].EmployeeID + 1;

            string lastName = Server.HtmlEncode(FirstNameTextBox.Text);
            string firstName = Server.HtmlEncode(LastNameTextBox.Text);

            FirstNameTextBox.Text = String.Empty;
            LastNameTextBox.Text = String.Empty;

            EmployeeList.Add(new Employee(employeeID, lastName, firstName));
            ViewState["EmployeeList"] = EmployeeList;

            EmployeesGridView.DataBind();
            EmployeesGridView.PageIndex = EmployeesGridView.PageCount;
        }

        protected void CancelButton_Click(object sender, EventArgs e)
        {
            FirstNameTextBox.Text = String.Empty;
            LastNameTextBox.Text = String.Empty;
        }

        [Serializable]
        public class Employee
        {
            private int _employeeID;
            private string _lastName;
            private string _firstName;

            public int EmployeeID
            {
                get { return _employeeID; }
            }

            public string LastName
            {
                get { return _lastName; }
            }

            public string FirstName
            {
                get { return _firstName; }
            }

            public Employee(int employeeID, string lastName, string firstName)
            {
                _employeeID = employeeID;
                _lastName = lastName;
                _firstName = firstName;
            }
        }

    </script>
</head>
<body>
    <form id="form1" >
    <div>
        &nbsp;</div>
        <asp:ScriptManager ID="ScriptManager1"  EnablePartialRendering="true" />
        <table>
            <tr>
                <td style="height: 206px" valign="top">
                    <asp:UpdatePanel ID="InsertEmployeeUpdatePanel"  UpdateMode="Conditional">
                        <ContentTemplate>
                          <table cellpadding="2" border="0" style="background-color:#7C6F57">
                            <tr>
                              <td><asp:Label ID="FirstNameLabel"  AssociatedControlID="FirstNameTextBox" 
                                             Text="First Name" ForeColor="White" /></td>
                              <td><asp:TextBox  ID="FirstNameTextBox" /></td>
                            </tr>
                            <tr>
                              <td><asp:Label ID="LastNameLabel"  AssociatedControlID="LastNameTextBox" 
                                             Text="Last Name" ForeColor="White" /></td>
                              <td><asp:TextBox  ID="LastNameTextBox" /></td>
                            </tr>
                            <tr>
                              <td></td>
                              <td>
                                <asp:LinkButton ID="InsertButton"  Text="Insert" OnClick="InsertButton_Click" ForeColor="White" />
                                <asp:LinkButton ID="Cancelbutton"  Text="Cancel" OnClick="CancelButton_Click" ForeColor="White" />
                              </td>
                            </tr>
                          </table>
                          <asp:Label  ID="InputTimeLabel"><%=DateTime.Now %></asp:Label>
                        </ContentTemplate>
                    </asp:UpdatePanel>
                </td>
                <td style="height: 206px" valign="top">
                    <asp:UpdatePanel ID="EmployeesUpdatePanel"  UpdateMode="Conditional">
                        <ContentTemplate>
                            <asp:GridView ID="EmployeesGridView"  BackColor="LightGoldenrodYellow" BorderColor="Tan"
                                BorderWidth="1px" CellPadding="2" ForeColor="Black" GridLines="None" AutoGenerateColumns="False">
                                <FooterStyle BackColor="Tan" />
                                <SelectedRowStyle BackColor="DarkSlateBlue" ForeColor="GhostWhite" />
                                <PagerStyle BackColor="PaleGoldenrod" ForeColor="DarkSlateBlue" HorizontalAlign="Center" />
                                <HeaderStyle BackColor="Tan" Font-Bold="True" />
                                <AlternatingRowStyle BackColor="PaleGoldenrod" />
                                <Columns>
                                    <asp:BoundField DataField="EmployeeID" HeaderText="Employee ID" />
                                    <asp:BoundField DataField="LastName" HeaderText="Last Name" />
                                    <asp:BoundField DataField="FirstName" HeaderText="First Name" />
                                </Columns>
                                <PagerSettings PageButtonCount="5" />
                            </asp:GridView>
                            <asp:Label  ID="ListTimeLabel"><%=DateTime.Now %></asp:Label>
                        </ContentTemplate>
                        <Triggers>
                            <asp:AsyncPostBackTrigger ControlID="InsertButton" EventName="Click" />
                        </Triggers>
                    </asp:UpdatePanel>
                </td>
            </tr>
        </table>
    </form>
</body>
</html>

Temas "Cómo..." y tutoriales

Referencia de clase

En la tabla siguiente se muestra una lista de las principales clases de servidor para la representación parcial de páginas.

Clase

Descripción

UpdatePanel

Especifica las regiones de la página que se van a actualizar durante la representación parcial de la página.

ScriptManager

Administra los componentes AJAX en ASP.NET, la representación parcial de páginas, las solicitudes de cliente y las respuestas del servidor en las páginas web ASP.NET.

ScriptManagerProxy

Permite que los componentes anidados agreguen script y referencias de servicio a las páginas que ya contienen un control ScriptManager en un elemento primario.

En la tabla siguiente se muestra una lista de la principal clase de cliente para la representación parcial de páginas.

Clase

Descripción

Sys.WebForms.PageRequestManager (Clase)

Administra la representación parcial de páginas de cliente y expone los miembros para el scripting de cliente personalizado.

Vea también

Conceptos

Información general sobre el control UpdatePanel

Información general sobre la clase PageRequestManager de ASP.NET