Páginas maestras y ASP.NET AJAX (VB)

por Scott Mitchell

Describe las opciones para usar ASP.NET AJAX y páginas maestras. Examina el uso de la clase ScriptManagerProxy; describe cómo se cargan los distintos archivos JS en función de si el ScriptManager se usa en la página maestra o en la página de contenido.

Introducción

En los últimos años, muchos más desarrolladores han estado creando aplicaciones web habilitadas para AJAX. Un sitio web habilitado para AJAX usa una serie de tecnologías web relacionadas para ofrecer una experiencia de usuario más dinámica. La creación de aplicaciones de ASP.NET habilitadas para AJAX es increíblemente fácil gracias al marco de Microsoft ASP.NET AJAX. ASP.NET AJAX está integrado en ASP.NET 3.5 y Visual Studio 2008; también está disponible como descarga independiente para aplicaciones de ASP.NET 2.0.

Al compilar páginas web habilitadas para AJAX con el marco de ASP.NET AJAX, debe agregar exactamente un control ScriptManager a cada página que use el marco de trabajo. Como su nombre implica, el ScriptManager administra el script del lado cliente que se usa en las páginas web habilitadas para AJAX. Como mínimo, el ScriptManager emite HTML que indica al explorador que descargue los archivos JavaScript que componen la biblioteca cliente de ASP.NET AJAX. También se puede usar para registrar archivos JavaScript personalizados, servicios web habilitados para scripts y funcionalidad de servicio de aplicación personalizada.

Si el sitio utiliza páginas maestras (como debe ser), no es necesario que añada un control ScriptManager a cada una de las páginas de contenido, sino que puede añadir un control ScriptManager a la página maestra. En este tutorial se muestra cómo agregar el control ScriptManager a la página maestra. También examina cómo usar el control ScriptManagerProxy para registrar scripts personalizados y servicios de script en una página de contenido específica.

Nota:

En este tutorial no se explora el diseño ni la creación de aplicaciones web habilitadas para AJAX con el marco de ASP.NET AJAX. Para obtener más información sobre el uso de AJAX, consulte los vídeos y tutoriales de ASP.NET AJAX, así como los recursos enumerados en la sección Lectura adicional al final de este tutorial.

Examen del marcado emitido por el control ScriptManager

El control ScriptManager emite marcas que indican al navegador que descargue los archivos JavaScript que componen la biblioteca cliente de ASP.NET AJAX. También agrega un poco de JavaScript insertado a la página que inicializa esta biblioteca. El siguiente marcado muestra el contenido que se agrega a la salida representada de una página que incluye un control ScriptManager:

<script src="/ASPNET_MasterPages_Tutorial_08_CS/WebResource.axd?d=T8EVk6SsA8mgPKu7_sBX5w2 t=633363040378379010" type="text/javascript"></script>

<script src="/ASPNET_MasterPages_Tutorial_08_CS/ScriptResource.axd?d=SCE1TCh8B24VkQIU5a8iJFizuPBIqs6Lka7GEkxo-6ROKNw5LVPCpF_pmLFR-R-p_Uf42Ahmr_SKd8lwgZUWb2uPJmfX0X_H6oLA50bniyQ1 t=633465688673751480" type="text/javascript"></script>

<script type="text/javascript">
//<![CDATA[
if (typeof(Sys) === 'undefined') throw new Error('ASP.NET Ajax client-side framework failed to load.');
//]]>
</script>

<script src="/ASPNET_MasterPages_Tutorial_08_CS/ScriptResource.axd?d=SCE1TCh8B24VkQIU5a8iJFizuPBIqs6Lka7GEkxo-6ROKNw5LVPCpF_pmLFR-R-phT96yZPngppiP_VXlN4Vz2RuVtvwDiQzF9xt42dUCiYjL0UylAJoyYzStwvObx0U0 t=633465688673751480" type="text/javascript"></script>

<script type="text/javascript">
//<![CDATA[
Sys.WebForms.PageRequestManager._initialize('ScriptManager1', document.getElementById('form1'));
Sys.WebForms.PageRequestManager.getInstance()._updateControls([], [], [], 90);
//]]>
</script>

<script type="text/javascript">
//<![CDATA[
Sys.Application.initialize();
//]]>
</script>

Las etiquetas <script src="url"></script> indican al explorador que descargue y ejecute el archivo JavaScript en la dirección URL. El ScriptManager emite tres etiquetas de este tipo; una hace referencia al archivo WebResource.axd, mientras que las otras dos hacen referencia al archivo ScriptResource.axd. Estos archivos no existen realmente como archivos en su sitio web. En su lugar, cuando una solicitud de uno de estos archivos llega al servidor web, el motor de ASP.NET examina la cadena de consultas y devuelve el contenido de JavaScript adecuado. La secuencia de comandos proporcionada por estos tres archivos JavaScript externos constituye la biblioteca cliente del marco ASP.NET AJAX. Las demás etiquetas <script> emitidas por el ScriptManager incluyen el script insertado que inicializa esta biblioteca.

Las referencias de script externo y el script insertado emitidos por el ScriptManager son esenciales para una página que usa el marco de ASP.NET AJAX, pero no es necesario para las páginas que no usan el marco. Por lo tanto, puede razonar que solo es ideal agregar un ScriptManager a las páginas que usan el marco ASP.NET AJAX. Y esto es suficiente, pero si tiene muchas páginas que usan el marco, acabará agregando el control ScriptManager a todas las páginas; una tarea repetitiva, como poco. Como alternativa, puede agregar un ScriptManager a la página maestra, que después inserta este script necesario en todas las páginas de contenido. Con este enfoque, no es necesario recordar agregar un ScriptManager a una nueva página que use el marco de ASP.NET AJAX porque ya está incluido en la página maestra. En el paso 1 se explica cómo agregar un ScriptManager a la página maestra.

Nota:

Si piensa incluir la funcionalidad de AJAX en la interfaz de usuario de su página maestra, no tiene otra opción: debe incluir el ScriptManager en la página maestra.

Una desventaja de agregar el ScriptManager a la página maestra es que el script anterior se emite en cada página, independientemente de si es necesario. Esto supone claramente un desperdicio de ancho de banda para aquellas páginas que tienen incluido el ScriptManager (a través de la página maestra) pero no utilizan ninguna característica del marco ASP.NET AJAX. ¿Pero cuánto ancho de banda se desperdicia?

  • El contenido real emitido por el ScriptManager (mostrado anteriormente) totaliza un poco más de 1 KB.
  • Sin embargo, los tres archivos de script externos a los que hace referencia el elemento <script> comprenden aproximadamente 450 KB de datos sin comprimir; en un sitio web que usa la compresión gzip, este ancho de banda total se puede reducir cerca de 100 KB. Sin embargo, el explorador almacena estos archivos de script en caché durante un año, lo que significa que solo necesitan descargarse una vez y luego pueden reutilizarse en otras páginas del sitio.

En el mejor de los casos, cuando se almacenan en caché los archivos de script, el costo total es de 1 KB, lo que es insignificante. Sin embargo, en el peor de los casos, es decir, cuando los archivos de script aún no se han descargado y el servidor web no utiliza ningún tipo de compresión, el impacto en el ancho de banda es de unos 450 KB, lo que puede suponer desde uno o dos segundos en una conexión de banda ancha hasta un minuto para los usuarios con módems de acceso telefónico. La buena noticia es que, dado que el explorador almacena en caché los archivos de script externos, este peor escenario se produce con poca frecuencia.

Nota:

Si todavía se siente incómodo colocar el control ScriptManager en la página maestra, considere el formulario web (el marcado <form runat="server"> en la página maestra). Cada página de ASP.NET que use el modelo de postback debe incluir exactamente un formulario web. Agregar un formulario web agrega contenido adicional: un número de campos de formulario ocultos, la propia etiqueta <form> y, si es necesario, una función de JavaScript para iniciar un postback desde el script. Este marcado es innecesario para las páginas que no hacen postback. Este marcado superfluo podría eliminarse eliminando el formulario web de la página maestra y añadiéndolo manualmente a cada página de contenido que lo necesite. Sin embargo, los beneficios de tener el formulario web en la página maestra superan las desventajas de tener que añadirlo innecesariamente a ciertas páginas de contenido.

Paso 1: agregar un control ScriptManager a la página maestra

Cada página web que use el marco de ASP.NET AJAX debe contener precisamente un control ScriptManager. Debido a este requisito, normalmente tiene sentido colocar un único control ScriptManager en la página maestra para que todas las páginas de contenido tengan el control ScriptManager incluido automáticamente. Además, el ScriptManager debe ir antes que cualquiera de los controles de servidor ASP.NET AJAX, como los controles UpdatePanel y UpdateProgress. Por lo tanto, es mejor colocar el ScriptManager antes de cualquier control ContentPlaceHolder dentro del formulario web.

Abra la página maestra Site.master y agregue un control ScriptManager a la página dentro del formulario web, pero antes del elemento <div id="topContent"> (véase la ilustración 1). Si usa Visual Web Developer 2008 o Visual Studio 2008, el control ScriptManager se encuentra en el cuadro de herramientas de la pestaña Extensiones de AJAX. Si usa Visual Studio 2005, primero deberá instalar el marco de ASP.NET AJAX y agregar los controles al Cuadro de herramientas. Visite la página de descarga de ASP.NET AJAX para obtener el marco de ASP.NET 2.0.

Después de agregar el ScriptManager a la página, cambie su ID de ScriptManager1 a MyManager.

Add the ScriptManager to the Master Page

Ilustración 01: agregar el ScriptManager a la página maestra (Haga clic para ver la imagen a tamaño completo)

Paso 2: usar el marco de ASP.NET AJAX desde una página de contenido

Con el control ScriptManager agregado a la página maestra ahora podemos añadir funcionalidad del marco de ASP.NET AJAX a cualquier página de contenido. Vamos a crear una nueva página de ASP.NET que muestra un producto seleccionado aleatoriamente de la base de datos Northwind. Utilizaremos el control Timer del marco de ASP.NET AJAX para actualizar esta pantalla cada 15 segundos, mostrando un nuevo producto.

Empiece por crear una nueva página en el directorio raíz denominado ShowRandomProduct.aspx. No olvide enlazar esta nueva página a la página maestra Site.master.

Add a New ASP.NET Page to the Website

Ilustración 02: agregar una nueva página ASP.NET al sitio web (Haga clic para ver la imagen a tamaño completo)

Recuerde que en el tutorial Especificar el título, las etiquetas meta y otros encabezados HTML del tutorial página maestra[SKM1] creamos una clase de página base personalizada denominada BasePage que generó el título de la página si no se estableció explícitamente. Vaya a la clase de código subyacente de la página ShowRandomProduct.aspx y haga que derive de BasePage (en lugar de System.Web.UI.Page).

Por último, actualice el archivo Web.sitemap para incluir una entrada para esta lección. Agregue el siguiente marcado debajo de la <siteMapNode> para la lección Interacción de la página maestra a contenido:

<siteMapNode url="~/ShowRandomProduct.aspx" title="Master Pages and ASP.NET AJAX" />

La adición de este elemento <siteMapNode> se refleja en la lista Lecciones (véase la ilustración 5).

Muestra de un producto seleccionado aleatoriamente

Vuelva a ShowRandomProduct.aspx. Desde el Diseñador, arrastre un control UpdatePanel desde el Cuadro de herramientas al control Content de MainContent y establezca su propiedad ID en ProductPanel. UpdatePanel representa una región en la pantalla que se puede actualizar de forma asincrónica a través de un postback de página parcial.

Nuestra primera tarea es mostrar información sobre un producto seleccionado aleatoriamente dentro de UpdatePanel. Empiece arrastrando un control DetailsView a UpdatePanel. Establezca la propiedad ID del control DetailsView en ProductInfo y borre sus propiedades Height y Width. Expanda la etiqueta inteligente de DetailsView y, en la lista desplegable Elegir origen de datos, elija enlazar DetailsView a un nuevo control SqlDataSource denominado RandomProductDataSource.

Bind the DetailsView to a New SqlDataSource Control

Ilustración 03: enlazar DetailsView a un nuevo control SqlDataSource (Haga clic para ver la imagen a tamaño completo)

Configure el control SqlDataSource para conectarse a la base de datos Northwind a través del NorthwindConnectionString (que creamos en el tutorial Interacción con la página maestra desde el tutorial de página de contenido[SKM2] ). Al configurar la instrucción select, elija especificar una instrucción SQL personalizada y, a continuación, escriba la siguiente consulta:

SELECT TOP 1 ProductName, UnitPrice
FROM Products
ORDER BY NEWID()

La palabra clave TOP 1 de la cláusula SELECT devuelve solo el primer registro devuelto por la consulta. La función NEWID() genera un nuevo valor de identificador único global (GUID) y se puede usar en una cláusula ORDER BY para devolver los registros de la tabla en un orden aleatorio.

Configure the SqlDataSource to Return a Single, Randomly Selected Record

Ilustración 04: configurar SqlDataSource para devolver un único registro seleccionado aleatoriamente (haga clic para ver la imagen a tamaño completo)

Después de completar el asistente, Visual Studio crea un BoundField para las dos columnas devueltas por la consulta anterior. En este momento, el marcado declarativo de la página debe tener un aspecto similar al siguiente:

<asp:UpdatePanel ID="ProductPanel" runat="server">
 <ContentTemplate>
 <asp:DetailsView ID="ProductInfo" runat="server" AutoGenerateRows="False" 
 DataSourceID="RandomProductDataSource">
 <Fields>
 <asp:BoundField DataField="ProductName" HeaderText="ProductName" 
 SortExpression="ProductName" />
 <asp:BoundField DataField="UnitPrice" HeaderText="UnitPrice" 
 SortExpression="UnitPrice" />
 </Fields>
 </asp:DetailsView>
 <asp:SqlDataSource ID="RandomProductDataSource" runat="server" 
 ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>" SelectCommand="SELECT TOP 1 ProductName, UnitPrice FROM Products ORDER BY NEWID()"></asp:SqlDataSource>
 </ContentTemplate>
</asp:UpdatePanel>

En la ilustración 5 se muestra la página ShowRandomProduct.aspx cuando se ve a través de un explorador. Haga clic en el botón Actualizar del explorador para volver a cargar la página; debería ver los valores ProductName y UnitPrice para un nuevo registro seleccionado aleatoriamente.

A Random Product's Name and Price is Displayed

Ilustración 05: se muestra el nombre y el precio de un producto aleatorio (haga clic para ver la imagen a tamaño completo)

Mostrar automáticamente un nuevo producto cada 15 segundos

El marco de ASP.NET AJAX incluye un control Timer que realiza un postback en un momento especificado; en postback se genera el evento Tick del temporizador. Si el control Timer se coloca dentro de UpdatePanel, desencadena una devolución de página parcial, durante la cual podemos volver a enlazar los datos a DetailsView para mostrar un nuevo producto seleccionado aleatoriamente.

Para ello, arrastre un temporizador desde el Cuadro de herramientas y colóquelo en UpdatePanel. Cambie el ID del temporizador de Timer1 a ProductTimer y su propiedad Interval de 60 000 a 15 000. La propiedad Interval indica el número de milisegundos entre postbacks; establecerla en 15 000 hace que el temporizador desencadene una devolución de página parcial cada 15 segundos. En este momento, el marcado declarativo del temporizador debe tener un aspecto similar al siguiente:

<asp:UpdatePanel ID="ProductPanel" runat="server" onload="ProductPanel_Load">
 <ContentTemplate>
 ...

 <asp:Timer ID="ProductTimer" runat="server" Interval="15000">
 </asp:Timer>
 </ContentTemplate>
</asp:UpdatePanel>

Cree un controlador de eventos para el evento Tick del temporizador. En este controlador de eventos, es necesario volver a enlazar los datos a DetailsView llamando al método DataBind de DetailsView. Al hacerlo, se indica a DetailsView que recupere los datos de su control de origen de datos, que seleccionará y mostrará un nuevo registro seleccionado aleatoriamente (igual que cuando se recarga la página haciendo clic en el botón Actualizar del navegador).

Protected Sub ProductTimer_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles ProductTimer.Tick
 ProductInfo.DataBind()
End Sub

Eso es todo. Vuelva a visitar la página a través de un explorador. Inicialmente, se muestra la información de un producto aleatorio. Si ve pacientemente la pantalla, observará que, después de 15 segundos, la información sobre un nuevo producto reemplaza mágicamente la pantalla existente.

Para ver mejor lo que sucede aquí, vamos a agregar un control Label a UpdatePanel que muestra la hora en que se actualizó la pantalla por última vez. Agregue un control web Label dentro de UpdatePanel, establezca su ID en LastUpdateTime y borre su propiedad Text. A continuación, cree un controlador de eventos para el evento Load de UpdatePanel y muestre la hora actual en la etiqueta. (El evento Load de UpdatePanel se desencadena en cada postback de página completa o parcial).

Protected Sub ProductPanel_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles ProductPanel.Load
 LastUpdateTime.Text = "Last updated at " & DateTime.Now.ToLongTimeString()
End Sub

Con este cambio completado, la página incluye la hora en que se cargó el producto mostrado actualmente. En la ilustración 6 se muestra la página cuando se visita por primera vez. En la ilustración 7 se muestra la página 15 segundos después de que el control Timer se haya "marcado" y UpdatePanel se haya actualizado para mostrar información sobre un nuevo producto.

A Randomly Selected Product is Displayed on Page Load

Ilustración 06: se muestra un producto seleccionado aleatoriamente en la carga de página (haga clic para ver la imagen a tamaño completo)

Every 15 Seconds a New Randomly Selected Product is Displayed

Ilustración 07: cada 15 segundos se muestra un nuevo producto seleccionado aleatoriamente (haga clic para ver la imagen a tamaño completo)

Paso 3: usar el control ScriptManagerProxy

Junto con la inclusión del script necesario para la biblioteca cliente del marco de ASP.NET AJAX, el ScriptManager también puede registrar archivos JavaScript personalizados, referencias a servicios web habilitados para scripts y autenticación personalizada, autorización y servicios de perfil. Normalmente, estas personalizaciones son específicas de una página determinada. Sin embargo, si se hace referencia a los archivos de script personalizados, referencias de servicio web o autenticación, autorización o servicios de perfil en el ScriptManager en la página maestra, se incluyen en todas las páginas del sitio web.

Para agregar personalizaciones relacionadas con el ScriptManager en una página por página, use el control ScriptManagerProxy. Puede agregar un ScriptManagerProxy a una página de contenido y, a continuación, registrar el archivo JavaScript personalizado, la referencia del servicio web o la autenticación, la autorización o el servicio de perfil desde ScriptManagerProxy; esto tiene el efecto de registrar estos servicios para la página de contenido concreta.

Nota:

Una página ASP.NET solo puede tener más de un control ScriptManager. Por lo tanto, no puede agregar un control ScriptManager a una página de contenido si el control ScriptManager ya está definido en la página maestra. El único propósito del ScriptManagerProxy es proporcionar a los desarrolladores una forma de definir el ScriptManager en la página maestra, pero con la posibilidad de agregar personalizaciones del ScriptManager página por página.

Para ver el control ScriptManagerProxy en acción, vamos a aumentar UpdatePanel en ShowRandomProduct.aspx para incluir un botón que usa script del lado cliente para pausar o reanudar el control Timer. El control Timer tiene tres métodos del lado cliente que podemos usar para lograr esta funcionalidad deseada:

  • _startTimer(): inicia el control Timer
  • _raiseTick(): hace que el control Timer haga "tick", de modo que se publique y genere su evento Tick en el servidor
  • _stopTimer(): detiene el control Timer

Vamos a crear un archivo JavaScript con una variable denominada timerEnabled y una función denominada ToggleTimer. La variable timerEnabled indica si el control Timer está habilitado o deshabilitado actualmente; el valor predeterminado es true. La función ToggleTimer acepta dos parámetros de entrada: una referencia al botón Pausar/Reanudar y el id del lado cliente del control Timer. Esta función alterna el valor de timerEnabled, obtiene una referencia al control Timer, inicia o detiene el Timer (según el valor de timerEnabled), y actualiza el texto para mostrar del botón a "Pausar" o "Reanudar". Se llamará a esta función cada vez que se haga clic en el botón Pausar/Reanudar.

Empiece por crear una nueva carpeta en el sitio web denominado Scripts. A continuación, agregue un nuevo archivo a la carpeta Scripts denominada TimerScript.js de tipo archivo JScript.

Add a New JavaScript File to the Scripts Folder

Ilustración 08: agregar un nuevo archivo JavaScript a la carpeta Scripts (haga clic para ver la imagen a tamaño completo)

A New JavaScript File has been Added to the Website

Ilustración 09: se ha agregado un nuevo archivo JavaScript al sitio web (haga clic para ver la imagen a tamaño completo)

A continuación, agregue el siguiente script al archivo TimerScript.js:

var timerEnabled = true;
function ToggleTimer(btn, timerID)
{
    // Toggle the timer enabled state
    timerEnabled = !timerEnabled;

    // Get a reference to the Timer
    var timer = $find(timerID);

    if (timerEnabled)
    {
        // Start timer
        timer._startTimer();

        // Immediately raise a tick
        timer._raiseTick();

        btn.value = 'Pause';
    }
    else
    {
        // Stop timer
        timer._stopTimer();

        btn.value = 'Resume';
    }
}

Ahora es necesario registrar este archivo JavaScript personalizado en ShowRandomProduct.aspx. Vuelva a ShowRandomProduct.aspx y agregue un control ScriptManagerProxy a la página; establezca su ID en MyManagerProxy. Para registrar un archivo JavaScript personalizado, seleccione el control ScriptManagerProxy en el Diseñador y, a continuación, vaya a la ventana Propiedades. Una de las propiedades se denomina Scripts. Al seleccionar esta propiedad se muestra el Editor de recopilación ScriptReference que se muestra en la ilustración 10. Haga clic en el botón Agregar para incluir una nueva referencia de script y, a continuación, escriba la ruta de acceso al archivo de script en la propiedad Path: ~/Scripts/TimerScript.js.

Add a Script Reference to the ScriptManagerProxy Control

Ilustración 10: agregar una referencia de script al control ScriptManagerProxy (haga clic para ver la imagen a tamaño completo)

Después de agregar la referencia al script, se actualiza el marcado declarativo del control ScriptManagerProxy para incluir una colección de <Scripts> con una sola entrada de ScriptReference, como se muestra en el siguiente fragmento de código de marcado:

<asp:ScriptManagerProxy ID="MyManagerProxy" runat="server">
 <Scripts>
 <asp:ScriptReference Path="~/Scripts/TimerScript.js" />
 </Scripts>
</asp:ScriptManagerProxy>

La entrada ScriptReference indica al ScriptManagerProxy que incluya una referencia al archivo JavaScript en su marcado representado. Es decir, al registrar el script personalizado en el ScriptManagerProxy, la salida representada de la página ShowRandomProduct.aspx ahora incluye otra etiqueta <script src="url"></script>: <script src="Scripts/TimerScript.js" type="text/javascript"></script>.

Ahora podemos llamar a la función ToggleTimer definida en TimerScript.js desde el script de cliente en la página ShowRandomProduct.aspx. Agregue el siguiente código HTML en UpdatePanel:

<input type="button" id="PauseResumeButton" 
    value="Pause" 
    onclick="ToggleTimer(this, '<%=ProductTimer.ClientID %>');" />

Esto muestra un botón con el texto "Pausar". Cada vez que se hace clic en él, se llama a la función de JavaScript ToggleTimer, pasando una referencia al botón y el valor id del control Timer (ProductTimer). Anote la sintaxis para obtener el valor id del control Timer. <%=ProductTimer.ClientID%> emite el valor de la propiedad ClientID del control Timer ProductTimer. En el tutorial Nomenclatura de identificadores de control en páginas de contenido[SKM3] se describen las diferencias entre el valor de ID del lado servidor y el valor de id del lado cliente resultante y cómo ClientID devuelve el id del lado cliente.

En la ilustración 11 se muestra esta página cuando se visita por primera vez a través de un explorador. El temporizador se está ejecutando actualmente y actualiza la información del producto mostrada cada 15 segundos. En la ilustración 12 se muestra la pantalla después de hacer clic en el botón Pausar. Al hacer clic en el botón Pausar, se detiene el temporizador y se actualiza el texto del botón a "Reanudar". La información del producto se actualizará (y continuará actualizando cada 15 segundos) una vez que el usuario haga clic en Reanudar.

Click the Pause Button to Stop the Timer Control

Ilustración 11: haga clic en el botón Pausar para detener el control Timer (haga clic para ver la imagen a tamaño completo)

Click the Resume Button to Restart the Timer

Ilustración 12: haga clic en el botón Reanudar para reiniciar el control Timer (haga clic para ver la imagen a tamaño completo)

Resumen

Al compilar aplicaciones web habilitadas para AJAX utilizando el marco ASP.NET AJAX, es imprescindible que todas las páginas web habilitadas para AJAX incluyan un control ScriptManager. Para facilitar este proceso, podemos agregar un ScriptManager a la página maestra en lugar de tener que recordar agregar un ScriptManager a cada página contenido. El paso 1 mostró cómo agregar el ScriptManager a la página maestra mientras que el paso 2 examinaba la implementación de la funcionalidad de AJAX en una página de contenido.

Si necesita agregar scripts personalizados, referencias a servicios web habilitados para scripts o autenticación, autorización o servicios de perfil personalizados a una página de contenido determinada, agregue un control ScriptManagerProxy a la página de contenido y, a continuación, configure las personalizaciones allí. Paso 3 examinó cómo usar el ScriptManagerProxy para registrar un archivo JavaScript personalizado en una página de contenido específica.

¡Feliz programación!

Lecturas adicionales

Para obtener más información sobre los temas tratados en este tutorial, consulte los siguientes recursos:

Acerca del autor

Scott Mitchell, autor de varios libros de ASP/ASP.NET y fundador de 4GuysFromRolla.com, ha estado trabajando con tecnologías web de Microsoft desde 1998. Scott trabaja como consultor independiente, entrenador y escritor. Su último libro es Sams Teach Yourself ASP.NET 3.5 in 24 Hours. Se puede contactar con Scott en mitchell@4GuysFromRolla.com o a través de su blog en http://ScottOnWriting.NET.

Agradecimientos especiales a

Muchos revisores han evaluado esta serie de tutoriales. ¿Le interesa revisar mis próximos artículos de MSDN? Si es así, escríbame a mitchell@4GuysFromRolla.com