14.04.2013 Views

Tema AJAX

Tema AJAX

Tema AJAX

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Programación avanzada en .NET con C#<br />

Servicio de Informática<br />

1<br />

<strong>AJAX</strong><br />

Índice<br />

Familiarizarse con Ajax .................................................................................................................. 2<br />

Introducción .............................................................................................................................. 2<br />

Relación de controles de <strong>AJAX</strong> ...................................................................................................... 2<br />

Control ScriptManager .......................................................................................................... 2<br />

Control ScriptManagerProxy ................................................................................................. 3<br />

Control UpdatePanel ............................................................................................................. 3<br />

Control UpdateProgress ........................................................................................................ 6<br />

Control Timer ........................................................................................................................ 6<br />

Ejemplos ........................................................................................................................................ 6<br />

Ejemplo 1 (Update sencillo) .................................................................................................. 6<br />

Ejemplo 2 (Update con UpdateProgress y tipos de disparadores) ...................................... 7<br />

Ejemplo 3 (disparador con FileUpload) ................................................................................. 8<br />

Ejemplo 4 (varios updatePanel y el timer) ............................................................................ 9<br />

Anidando UpdatePanels. ............................................................................................................. 10<br />

Ejemplo 5 ............................................................................................................................. 10<br />

Instrucciones para el control de llamadas asíncronas ........................................................ 13<br />

Ejercicio 1. ................................................................................................................................... 14<br />

Uso de <strong>AJAX</strong> Avanzado ................................................................................................................ 16<br />

Ejemplo 5 (actualizar un control fuera del UpdatePanel): ...................................................... 16<br />

Ejemplo 6 (Autoarranque y barra de progreso por programación): ....................................... 18<br />

Cancelación de actualizaciones de UpdatePanel .................................................................... 19<br />

Varios UpdatePanels ............................................................................................................... 20<br />

Ejercicio 2. ................................................................................................................................... 21<br />

<strong>AJAX</strong> Control ToolsKit .................................................................................................................. 22<br />

ValidatorCalloutExtender ........................................................................................................ 23<br />

Ejemplo 7 (Callout) .................................................................................................................. 24


Programación avanzada en .NET con C#<br />

Servicio de Informática<br />

Familiarizarse con Ajax<br />

2<br />

<strong>AJAX</strong><br />

Introducción<br />

El modelo estándar de trabajo hasta ahora con ASP.NET ha sido utilizar el modelo postback<br />

conde las páginas están perpetuamente reenviándose al servidor web y regenerándose. Esto<br />

conlleva la desventaja de que se reenvían todos los datos al servidor, además de un incómodo<br />

parpadeo.<br />

La nueva generación de aplicaciones web utiliza un conjunto de prácticas de diseño y<br />

tecnologías conocidas como Ajax cuya característica fundamental es la capacidad para<br />

actualizar parte de la página, mientras que deja el resto intacto.<br />

<strong>AJAX</strong> son las siglas de Asynchronous JavaScript And XML. No es un lenguaje de programación<br />

sino un conjunto de tecnologías (HTML-JavaScript-CSS-DHTML-PHP/ASP.NET/JSP-XML) que nos<br />

permiten hacer páginas de internet más interactivas.<br />

La característica fundamental de <strong>AJAX</strong> es permitir actualizar parte de una página con<br />

información que se encuentra en el servidor sin tener que refrescar completamente la página.<br />

De modo similar podemos enviar información al servidor.<br />

Vamos a sorprendernos al ver que ASP.Net esconde la complejidad de Ajax y permite una fácil<br />

transición entre aplicaciones web tradicionales y el nuevo modelo.<br />

Relación de controles de <strong>AJAX</strong><br />

Control ScriptManager<br />

El control ScriptManager administra el script de<br />

cliente de las páginas web ASP.NET habilitadas<br />

para <strong>AJAX</strong>. De forma predeterminada, el control<br />

ScriptManager registra el script de Microsoft Ajax<br />

Library con la página. Esto permite al script de<br />

cliente usar las extensiones del sistema de tipos y<br />

admitir características como la representación<br />

parcial de páginas y las llamadas a servicios Web.<br />

Más adelante veremos cómo ampliar el javascript<br />

de manera que sólo actúe en la parte de página<br />

que se carga por <strong>AJAX</strong> y los posibles usos.<br />

Hay una propiedad a destacar: el tiempo que debe esperar la página de ASP.NET que hace la<br />

llamada antes de dar un timeScriptOut. Por defecto son 90 segundos. Si deseamos ampliar<br />

este tiempo usaremos:


Programación avanzada en .NET con C#<br />

Servicio de Informática<br />

3<br />

<strong>AJAX</strong><br />

AsyncPostBackTimeOut="36000"<br />

Donde 36000 son segundos. Ahora dejamos que el timeScriptOut lo del IIS.<br />

Control ScriptManagerProxy<br />

El control ScriptManagerProxy permite que los componentes anidados, como páginas de<br />

contenido (content pages) y controles de usuario, agreguen a las páginas referencias a scripts<br />

y servicios cuando ya se ha definido un control ScriptManager en un elemento primario (como<br />

por ejemplo en un master page). Una página web sólo puede contener un control<br />

ScriptManager, bien de forma directa en la propia página, o de forma indirecta en un<br />

componente anidado o primario. El control ScriptManagerProxy permite agregar scripts y<br />

servicios a páginas de contenido y controles de usuario donde la página maestra o la página<br />

host ya contienen un control ScriptManager.<br />

El control ScriptManagerProxy requiere configuración específica en un archivo web.config para<br />

funcionar correctamente. Si intenta trabajar con este control y el sitio web no contiene el<br />

archivo web.config necesario, los errores aparecen en la vista Diseño de la página donde<br />

podría haber aparecido el control. En la vista Diseño, si hace clic en el control que está en ese<br />

estado, Microsoft Expression Web le ofrecerá la opción de crear o actualizar el archivo<br />

web.config.<br />

Control UpdatePanel<br />

Ver ejemplo 1.<br />

Los UpdatePanel permiten generar aplicaciones web<br />

enriquecidas y centradas en el cliente. Estos controles<br />

permiten actualizar las partes seleccionadas de una página<br />

en lugar de actualizar toda la página con una devolución de<br />

datos. Esto se conoce como actualización parcial de la<br />

página. Una página web ASP.NET que contiene un control<br />

ScriptManager (esto es obligatorio) y uno o varios controles<br />

UpdatePanel puede participar automáticamente en<br />

actualizaciones parciales de la página, sin un script de<br />

cliente personalizado.


Programación avanzada en .NET con C#<br />

Servicio de Informática<br />

4<br />

<strong>AJAX</strong><br />

Distinguimos 2 tipos de disparadores según desde donde actúen:<br />

- Disparador dentro del updatePanel. Simplemente:<br />

protected void BotonDentro_Click(object sender, EventArgs e)<br />

{<br />

Thread.Sleep(10000);<br />

Foto.ImageUrl = "foto.jpg";<br />

}<br />

- Disparador fuera de updatePanel.


Programación avanzada en .NET con C#<br />

Servicio de Informática<br />

Ver ejemplo 2.<br />

5<br />

<strong>AJAX</strong><br />

Distinguimos 2 tipos de disparadores fuera de updatePanel según cómo actúen:<br />

Los disparadores pueden ser asíncronos a síncronos.<br />

Lo normal es crear disparadores asíncronos (AsyncPostBackTrigger).<br />

Si creamos un disparador síncrono (PostBackTrigger) lo que conseguimos es hacer un postback<br />

normal sobre la misma página actuando también dentro del UpdatePanel.<br />

Esto es interesante con controles del tipo “FileUpload”, puesto que solo funcionaran si usamos<br />

el trigger PostBackTrigger.<br />

Ver ejemplo 3.<br />

Existe una propiedad importante: UpdateMode. UpdateMode puede valer 1 :<br />

• Always: el contenido del UpdatePanel será siempre será renderizado cada vez que se<br />

invoque un postback, independientemente que sea el mismo UpdatePanel.<br />

• Conditional: el UpdatePanel solo se renderizara cuando en los siguientes escenarios: un<br />

control hijo del UpdatePanel invoca un postback, se registra un trigger a evento de algún<br />

control que no se encuentra fuera del UpdatePanel, se llama al método Update del<br />

control UpdatePanel manual mente.<br />

Ver ejemplo 4.<br />

1<br />

http://www.frameworkla.net/?post=Modos+de+actualizaci%C3%B3n+del+UpdatePanel#/Post/Modos%<br />

20de%20actualizaci%C3%B3n%20del%20UpdatePanel


Programación avanzada en .NET con C#<br />

Servicio de Informática<br />

Control UpdateProgress<br />

6<br />

<strong>AJAX</strong><br />

Si una página contiene controles UpdatePanel también puede incluir controles<br />

UpdateProgress para mantener a los usuarios informados sobre el estado de las<br />

actualizaciones parciales de página.<br />

Puede usar un control UpdateProgress de dos formas diferentes: una para representar el<br />

progreso de las actualizaciones parciales de la página entera y otra para representar el<br />

progreso de un solo control UpdatePanel.<br />

Más adelante veremos con inyectar javascript en estos controles.<br />

Ver ejemplo 2.<br />

Control Timer<br />

El control Timer de Microsoft Ajax realiza postbacks a intervalos definidos. Si utiliza el control<br />

Timer con un control UpdatePanel, puede habilitar actualizaciones parciales de página en un<br />

intervalo definido. También puede utilizar el control Timer para enviar toda la página.<br />

También se puede utilizar este control como disparador () de uno o varios<br />

UpdatePanels.<br />

Ver ejemplo 4.<br />

Ejemplos<br />

Ejemplo 1 (Update sencillo)<br />

Crea un nuevo proyecto web y un nuevo elemento (un nuevo web form). Crea la estructura<br />

que se muestra. En ella puedes observar:<br />

• Un ScriptManager.<br />

• Un label (ID=fuera), una caja de texto (ID=TextFuera), un label de resultado<br />

(ID=ResultadoFuera) y un botón (ID=BotonFuera).


Programación avanzada en .NET con C#<br />

Servicio de Informática<br />

• Un separador ()<br />

7<br />

<strong>AJAX</strong><br />

• Un panel con fondo gris y borde. Dentro del panel hay un updatePanel.<br />

• Dentro de updatePanel ponemos: Un label (ID=dentro), una caja de texto<br />

(ID=TextDentro), un label de resultado (ID=ResultadoDentro) y un botón<br />

(ID=BotonDentro).<br />

• Dentro de updatePanel ponemos una imagen pequeña (para el ejemplo2) (ID=Foto).<br />

En la clase asociada solo utilizamos el evento Page_Load:<br />

protected void Page_Load(object sender, EventArgs e)<br />

{<br />

this.ResultadoDentro.Text += this.TextDentro.Text;<br />

this.ResultadoFuera.Text += this.TextFuera.Text;<br />

}<br />

Y al ejecutar vemos la diferencia que hay de usar un botón u otro.<br />

Ejemplo 2 (Update con UpdateProgress y tipos de disparadores)<br />

Vamos a cargar el UpdatePanel con un disparador.<br />

El objetivo es que al pulsar sobre cualquier botón se cargue una imagen grande y remota que<br />

reemplace a la pequeña (ID=Foto) que tenemos dentro de UpdatePanel.<br />

Para hacer la prueba usamos que simula una tardanza de 10 segundos.<br />

Thread.Sleep(10000);<br />

Una ayuda visual para el usuario de manera que vea que en la página está pasando algo lo<br />

logramos con un updateProgress.<br />

<br />

<br />

<br />

<br />

<br />

Pero podemos observar que este aviso sólo funciona cuando actualizamos el UpdatePanel con<br />

el disparador de dentro (BotonDentro). Para que funcione con el otro botón tendremos que<br />

recurrir a inyectar Javascript en el ScriptManager tal y cómo se explica más adelante.


Programación avanzada en .NET con C#<br />

Servicio de Informática<br />

Ejemplo 3 (disparador con FileUpload)<br />

La única forma de hacer que esto funcione:<br />

8<br />

<strong>AJAX</strong><br />

Dos propiedades a destacar son “DisplayAfter” que sirve<br />

para que UpdateProgress ocupe siempre el mismo espacio y<br />

no se contraiga cuando no se llama.<br />

O DisplayAfter muy útil para evitar molestos parpadeos<br />

cuando se usa con un control Timer por ejemplo.<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

Es usando PostBackTrigger.<br />

Echando un vistazo a la programación en C#:<br />

using System;<br />

public partial class Default_8 : System.Web.UI.Page<br />

{<br />

protected void Page_Load(object sender, EventArgs e)


Programación avanzada en .NET con C#<br />

Servicio de Informática<br />

}<br />

{<br />

}<br />

9<br />

<strong>AJAX</strong><br />

Label2.Text = DateTime.Now.ToString();<br />

protected void Button1_Click(object sender, EventArgs e)<br />

{<br />

String savePath =<br />

@"C:\trabajo\Dropbox\_c_av_2ed\pruebas\ejemplo\";<br />

if (FileUpload1.HasFile)<br />

{<br />

String fileName = FileUpload1.FileName;<br />

savePath += fileName;<br />

FileUpload1.SaveAs(savePath);<br />

Label1.Text = "Se guardó el fichero " + fileName;<br />

}<br />

else<br />

{<br />

Label1.Text = "Indica un nombre para el fichero.";<br />

}<br />

}<br />

Ejemplo 4 (varios updatePanel y el timer)<br />

Añadimos a nuestro ejemplo otro UpdatePanel.<br />

• Añadimos un label: <br />

• Añadimos otro label: <br />

• Dentro añadimos un control Timer que funcione cada 600 milisegundos. Haciendo<br />

doble click sobre el control Timer creamos el evento que se deberá ejecutar cada 600<br />

milisegundos, que muestre la hora en el label “LaHora”.<br />

LaHora.Text = DateTime.Now.ToString();


Programación avanzada en .NET con C#<br />

Servicio de Informática<br />

10<br />

<strong>AJAX</strong><br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

Observar el comportamiento de la página. Cambiar la propiedad UpdateMode en ambos<br />

UpdatePanels a condicional y volver a observar cómo cambia el comportamiento.<br />

Anidando UpdatePanels 2.<br />

En algunos escenarios, la anidación de los controles UpdatePanel permite proporcionar<br />

funcionalidad de interfaz de usuario que sería difícil proporcionar de otra forma. Los paneles<br />

anidados son útiles si desea actualizar separadamente regiones concretas de la página y<br />

actualizar al mismo tiempo varias regiones. Esto se puede lograr si establece la propiedad<br />

UpdateMode de los controles externo y anidado en Conditional. De esta forma, el panel<br />

externo no actualiza la región de su página si sólo se actualiza el panel interno. Sin embargo, si<br />

se actualiza el panel externo, también se actualizan los paneles anidados.<br />

Ejemplo 5<br />

2 http://msdn.microsoft.com/es-es/library/bb398867.aspx


Programación avanzada en .NET con C#<br />

Servicio de Informática<br />

Anidamos 2 updatePanels:<br />

11<br />

<strong>AJAX</strong><br />

• Ambos tendrán la propiedad de UpdateMode a Conditional.<br />

• El de arriba se llamará updatePanelSuperior y contiene una imagen, un label y un<br />

button, además del otro updatePanel.<br />

• El de abajo se llamará updatePanelInferior y contiene una imagen, un label y un<br />

button.<br />

Se han añadido además 3 updateProgress, uno sin asociar a nada, otro asociado a<br />

UpdatePanelSuperior y otro a UpdatePanelInferior.<br />

Ya podemos añadir programación:<br />

protected void ButtonInferior_Click(object sender, EventArgs e)<br />

{<br />

programacion();<br />

}<br />

protected void ButtonSuperior_Click(object sender, EventArgs e)<br />

{<br />

programacion();<br />

}<br />

private void programacion()<br />

{<br />

Thread.Sleep(1000);<br />

ImageSuperior.ImageUrl = "img/foto.jpg";<br />

ImageSuperior.Width = 600;<br />

HoraSuperior.Text = DateTime.Now.ToString();<br />

ImageInferior.ImageUrl = "img/foto2.jpg";<br />

ImageInferior.Width = 600;<br />

HoraInferior.Text = DateTime.Now.ToString();<br />

}<br />

Si pulsamos sobre el botonInferior:


Programación avanzada en .NET con C#<br />

Servicio de Informática<br />

Si pulsamos sobre el superior:<br />

12<br />

<strong>AJAX</strong>


Programación avanzada en .NET con C#<br />

Servicio de Informática<br />

Instrucciones para el control de llamadas asíncronas<br />

13<br />

<strong>AJAX</strong><br />

Para comprobar si la página está haciendo un postback usamos:<br />

protected void Page_Load(object sender, EventArgs e)<br />

{<br />

if (IsPostBack) { programacion(); }<br />

}<br />

Para comprobar que el postback es asíncrono, entonces usamos:<br />

protected void Page_Load(object sender, EventArgs e)<br />

{<br />

if (ScriptManager.GetCurrent(this).IsInAsyncPostBack)<br />

{<br />

programacion();<br />

}<br />

}<br />

También podemos forzar que un updatePanel se actualice usando update():<br />

private void programacion()


Programación avanzada en .NET con C#<br />

Servicio de Informática<br />

{<br />

}<br />

14<br />

<strong>AJAX</strong><br />

Thread.Sleep(10000);<br />

ImageSuperior.ImageUrl = "img/foto.jpg";<br />

ImageSuperior.Width = 600;<br />

HoraSuperior.Text = DateTime.Now.ToString();<br />

ImageInferior.ImageUrl = "img/foto2.jpg";<br />

ImageInferior.Width = 600;<br />

HoraInferior.Text = DateTime.Now.ToString();<br />

UpdatePanelSuperior.Update();<br />

Ejercicio 1.<br />

A partir de estas clases que se te entregan resuelve el problema.<br />

Se pide una web que muestre en un primer momento:


Programación avanzada en .NET con C#<br />

Servicio de Informática<br />

15<br />

<strong>AJAX</strong><br />

Suponemos que la carga de los datos acarrea algo de tiempo.<br />

Para que al pulsar la página no de la sensación de no hacer<br />

nada se piden 3 indicadores de progreso:<br />

• Cuando la página está haciendo algo<br />

• Cuando se están actualizando las personas o la ficha<br />

de persona.<br />

• Cuando se está actualizando la ficha de persona.<br />

Si seleccionamos una localización se aplica un filtro de<br />

manera que las personas que se muestran son las que<br />

trabajan en esa localización. Se pide que no se recargue la<br />

página entera.<br />

Si seleccionamos una persona se muestra la ficha de la<br />

persona. Se pide que no se recargue la página entera.<br />

Se ha asociado un página CSS para cuidar el formato. Para que un UpdateProgress se pueda<br />

poner a la altura de un label se debe meter en un panel y asociarle un estilo que tenga “float:<br />

left”.<br />

Una vez terminada enviar por mail en un fichero comprimido llamado Nombre_Ajax01 para la<br />

evaluación del curso.


Programación avanzada en .NET con C#<br />

Servicio de Informática<br />

Uso de <strong>AJAX</strong> Avanzado 3<br />

16<br />

<strong>AJAX</strong><br />

Si en una página normal quisiéramos inyectar algo de código javascript que se ejecutar al<br />

arrancar la página usaríamos:<br />

protected void Page_Load(object sender, EventArgs e)<br />

{<br />

string _script = "";<br />

_script += "alert('Ejecutado');";<br />

Page.ClientScript.RegisterStartupScript(<br />

this.GetType(), "myscript", _script, true);<br />

}<br />

Si usamos <strong>AJAX</strong> este código sólo se ejecutaría una vez. Pero ¿y si quisiéramos ejecutar una<br />

función de javascript cada vez se ejecutara un <strong>AJAX</strong>?<br />

Esta función se ejecutará al cargar la página y cada vez que usemos <strong>AJAX</strong>:<br />

protected void Page_Load(object sender, EventArgs e)<br />

{<br />

string _script = "";<br />

_script += "alert('Ejecutado');";<br />

ScriptManager.RegisterStartupScript(<br />

this,this.GetType(),"myscript",_script,true);<br />

}<br />

Esta función se ejecutará SOLO al usar <strong>AJAX</strong>:<br />

protected void Page_Load(object sender, EventArgs e)<br />

{<br />

if (Page.IsPostBack)<br />

{<br />

string _script = "";<br />

_script += "$get('Resultado').innerHTML += 'Ejecutado';";<br />

ScriptManager.RegisterStartupScript(<br />

this, this.GetType(), "myscript", _script, true);<br />

}<br />

}<br />

Ejemplo 5 (actualizar un control fuera del UpdatePanel):<br />

Dada esta página:<br />

3 http://msdn.microsoft.com/es-es/magazine/cc163354.aspx


Programación avanzada en .NET con C#<br />

Servicio de Informática<br />

17<br />

<strong>AJAX</strong><br />

Buscamos que cada vez que ocurra una actualización <strong>AJAX</strong> se refleje este cambio en una<br />

etiqueta resultado que está fuera de los UpdatePanel. Este es el código asociado:<br />

public partial class Default_5 : System.Web.UI.Page<br />

{<br />

protected void Page_Load(object sender, EventArgs e)<br />

{<br />

if (Page.IsPostBack)<br />

{<br />

string _script = "";<br />

_script += "$get('Resultado').innerHTML += 'Ejecutado';";<br />

ScriptManager.RegisterStartupScript(<br />

this, this.GetType(), "myscript", _script, true);<br />

}<br />

}<br />

}<br />

protected void ButtonArriba_Click(object sender, EventArgs e)<br />

{<br />

Thread.Sleep(1000);<br />

txtArriba.Text += "Pulsado arriba";<br />

}<br />

protected void ButtonAbajo_Click(object sender, EventArgs e)<br />

{<br />

Thread.Sleep(1000);<br />

txtAbajo.Text += "Pulsado abajo";<br />

}<br />

Pero nuestro objetivo no es que aparezca cualquier texto, sino que ponga un texto<br />

personalizado en función de lo que ha actualizado.<br />

Entonces necesitamos por un lado hacer la llamada a una función de Javascript y por otro lado<br />

tener registrado el código de Javascript.<br />

Para hacer la llamada usamos ScriptManager1.RegisterDataItem:<br />

protected void ButtonArriba_Click(object sender, EventArgs e)<br />

{<br />

Thread.Sleep(1000);<br />

txtArriba.Text += "Pulsado arriba";<br />

ScriptManager1.RegisterDataItem(Resultado, txtArriba.Text);<br />

}


Programación avanzada en .NET con C#<br />

Servicio de Informática<br />

18<br />

<strong>AJAX</strong><br />

“Resultado” es el nombre del control que se pasa a Javascript y “txtArriba.Text” es el<br />

valor que estamos pasando, en este caso un string.<br />

Por otro lado creamos un fichero .js (mi.js) con el código Javascript que consideramos<br />

necesario. En este caso buscamos en el código el ID resultado e insertamos como contenido<br />

html el que me llega en el array “args”<br />

Sys.WebForms.PageRequestManager.getInstance().add_pageLoading(MiFuncio<br />

n);<br />

function MiFuncion(sender,args){<br />

$get('Resultado').innerHTML =<br />

args.get_dataItems()['Resultado'];<br />

return;<br />

}<br />

Y se lo añadimos a nuestra página:<br />

<br />

<br />

<br />

<br />

<br />

Ejemplo 6 (Autoarranque y barra de progreso por programación):<br />

Puede ocurrir que nuestra página sea extremadamente pesada de cargar y deseamos mostrar<br />

un pequeño mensaje al usuario mientras que el resto de la página se carga. Para ello deseamos<br />

que un UpdatePanel se ejecute nada más arrancar la página ¿Cómo lo hacemos?<br />

Necesitamos, como en el ejemplo 5 un .js.<br />

Sys.WebForms.PageRequestManager.getInstance().<br />

add_initializeRequest(Inicia);<br />

Sys.WebForms.PageRequestManager.getInstance().<br />

add_endRequest(Finaliza);<br />

var elementoPostBack;<br />

function Inicia(sender, args) {<br />

elementoPostBack = args.get_postBackElement().id;<br />

if (elementoPostBack == 'ButtonArriba')<br />

$get('UpdateProgressArriba').style.display = 'block';<br />

}<br />

function Finaliza(sender, args) {<br />

if (elementoPostBack == 'ButtonArriba')<br />

$get('UpdateProgressArriba').style.display = 'none';<br />

}


Programación avanzada en .NET con C#<br />

Servicio de Informática<br />

Y en el .cs<br />

19<br />

<strong>AJAX</strong><br />

public partial class Default_6 : System.Web.UI.Page<br />

{<br />

protected void Page_Load(object sender, EventArgs e)<br />

{<br />

Page.ClientScript.RegisterStartupScript(this.GetType(), "xx",<br />

"$get('ButtonArriba').click();", true);<br />

}<br />

}<br />

protected void ButtonArriba_Click(object sender, EventArgs e)<br />

{<br />

Thread.Sleep(10000);<br />

txtArriba.Text += "Pulsado arriba";<br />

}<br />

Otra forma de autoarrancar sería en lugar de<br />

Page.ClientScript.RegisterStartupScript(this.GetType(), "xx", "$get('ButtonArriba').click();",<br />

true);<br />

Sería:<br />

Page.ClientScript.RegisterStartupScript(this.GetType(), "xx", "<br />

__doPostBack('ButtonArriba','Hola');”", true);<br />

Donde el primer argument sería el disparador (en nuestro caso ButtonArriba) y el segundo<br />

serían los argumentos.<br />

Para rescatar los argumentos desde C#:<br />

protected void ButtonArriba_Click(object sender, EventArgs e)<br />

{<br />

string _argumento = Request.Params.Get("__EVENTARGUMENT");<br />

txtArriba.Text += _argumento;<br />

}<br />

Para más información:<br />

http://aspalliance.com/895_Understanding_the_JavaScript___doPostBack_Function.all<br />

Para ver el resto de los miembros de la clase de Javascript<br />

Sys.WebForms.PageRequestManager<br />

http://msdn.microsoft.com/es-es/library/bb311028.aspx<br />

Cancelación de actualizaciones de UpdatePanel<br />

El evento pageLoaded es uno de los que desencadena la clase PageRequestManager cuando<br />

un UpdatePanel regresa al servidor para actualizar su contenido. Otro evento importante que


Programación avanzada en .NET con C#<br />

Servicio de Informática<br />

20<br />

<strong>AJAX</strong><br />

desencadena PageRequestManager es initializeRequest, que tiene lugar antes de que se<br />

produzca una devolución de llamada asincrónica.<br />

El segundo parámetro que se transmite a un controlador de initializeRequest es un objeto del<br />

tipo initializeRequestEventArgs. Este objeto contiene un método get_postBackElement que<br />

identifica el botón o el elemento que ha desencadenado la actualización. También dispone de<br />

un método set_cancel que se puede usar para cancelar una devolución de llamada antes de<br />

que ocurra. Este es un ejemplo del método set_cancel en acción:<br />

<br />

var prm = Sys.WebForms.PageRequestManager.getInstance();<br />

prm.add_initializeRequest(inicia);<br />

function inicia(sender, args)<br />

{<br />

args.set_cancel(!confirm(‘¿Seguro?’));<br />

}<br />

<br />

En este ejemplo, antes de que se ejecute una devolución de llamada, un controlador de<br />

intializeRequest abre un cuadro de confirmación que pregunta al usuario si debe continuar la<br />

actualización. Al hacer clic en Cancelar en el cuadro de confirmación, se transfiere true a<br />

set_cancel, lo que detiene en seco la devolución de llamada.<br />

En la vida real, probablemente no le interesa pedir confirmación al usuario antes de permitir<br />

que continúe una actualización pero podría ser útil tener la posibilidad de cancelar una<br />

actualización en función de las condiciones que existan en otras partes de la aplicación.<br />

Varios UpdatePanels<br />

Una página puede contener varios UpdatePanels. De forma predeterminada, cuando se<br />

actualiza un UpdatePanel en una página, los demás UpdatePanel de la página también se<br />

actualizan. A veces esto será lo que quiera pero, pero con frecuencia, no necesitará que se<br />

actualicen todos los UpdatePanel como respuesta a la actualización de otros UpdatePanel.<br />

Puede elegir las instancias de UpdatePanel que desee actualizar (y cuándo) si establece en<br />

"Condicional" la propiedad de UpdateMode de cada control UpdatePanel de la página.<br />

A continuación, cuando se actualice un UpdatePanel y éste llame a un controlador de eventos<br />

del cliente, llame a UpdatePanel.Update en los demás paneles que desee actualizar. De este<br />

modo se reduce la carga en el servidor, al disminuir el número de controles que se<br />

representan, y se reduce el volumen de datos de la respuesta porque los UpdatePanel que no<br />

se actualicen no agregarán nada a la respuesta.


Programación avanzada en .NET con C#<br />

Servicio de Informática<br />

21<br />

<strong>AJAX</strong><br />

Ejercicio 2.<br />

Crea una página con un texto introductorio que al arrancar cargue por <strong>AJAX</strong> 3 imágenes<br />

remotas y que las muestre.<br />

Debe aparecer abajo un control “Label” que indique el tiempo que ha durado la carga (se usa<br />

el objeto System.Diagnostics.Stopwatch).<br />

Además, mientras se esté cargando aparecerá un mensaje de “cargando”.<br />

Una vez terminada enviar por mail en un fichero comprimido llamado Nombre_Ajax02 para la<br />

evaluación del curso.


Programación avanzada en .NET con C#<br />

Servicio de Informática<br />

<strong>AJAX</strong> Control ToolsKit 4<br />

22<br />

<strong>AJAX</strong><br />

ToolsKit contiene una serie de controles Web y extendedores con los que podremos utilizar las<br />

avanzadas características de ASP.NET <strong>AJAX</strong> sin más que un arrastre de ratón. Del mismo modo,<br />

con su descarga disponemos de ejemplos de uso, así como del propio código fuente de los<br />

controles.<br />

Vamos a distinguir entre controles Web y extendedores, donde los primeros tienen una<br />

entidad por sí mismos, mientras que los segundos únicamente añaden un comportamiento a<br />

un control Web existente.<br />

Se trata de una serie de pequeñas funcionalidades que cualquier webmaster, en su historia de<br />

programador, ha utilizado o deseado para sus Webs. La diferencia ahora es que los ejemplos<br />

son 100% <strong>AJAX</strong> y usarlos no exige conocimiento alguno sobre <strong>AJAX</strong>, javascript o XML.<br />

Para instalar:<br />

Desde la Web donde se centraliza el trabajo sobre el ASP.NET<br />

<strong>AJAX</strong> Control Toolkit, en su apartado de descargas:<br />

http://ajaxcontroltoolkit.codeplex.com/releases/view/74023<br />

Podemos elegir entre descargarnos o no el código fuente junto<br />

con el resto del Kit. Nosotros elegiremos la opción en que lo<br />

tiene. Seguiremos a continuación los siguientes pasos:<br />

1.- Aceptar los términos y condiciones tras haberlos leído y<br />

guardar el archivo AjaxControlToolkit.zip en nuestro ordenador.<br />

2.- Descomprimir el fichero. Podemos observar los directorios:<br />

en uno se ubica el código fuente, en otro su correspondiente<br />

binario, templates, etc. La carpeta “SampleWebSite” contiene<br />

un proyecto con ejemplos específicos de cada uno de los<br />

controles que componen esta versión del ASP.NET <strong>AJAX</strong> Control<br />

Toolkit.<br />

3.- Ahora iniciemos el Visual Studio. Elegimos crear un nuevo<br />

WebSite.<br />

4.- Vamos a añadir los controles del ASP.NET <strong>AJAX</strong> Control<br />

Toolkit a nuestra caja de herramientas. Para ello, una vez<br />

dentro de cualquiera de nuestras páginas (por ejemplo<br />

default.aspx), presionamos el botón derecho sobre nuestra caja<br />

de herramientas para elegir Add Tab (agregar ficha). Con ello,<br />

crearemos un tab específico en nuestra caja de herramientas<br />

4 http://www.es-asp.net/tutoriales-asp-net/tutorial-0-5312/asp-net-ajax-control-toolkit.aspx


Programación avanzada en .NET con C#<br />

Servicio de Informática<br />

23<br />

<strong>AJAX</strong><br />

para el ASP.NET <strong>AJAX</strong> Control Toolkit. Y le llamamos (por ejemplo) “ASP.NET <strong>AJAX</strong> Control<br />

Toolkit”.<br />

5.- Desplegamos nuestro nuevo tab y de nuevo recurrimos al botón derecho y elegimos<br />

“Choose ítems...”(elegir elementos) Desde el botón de “Browse...” (examinar) buscamos la<br />

carpeta donde hemos descomprimido nuestro ASP.NET <strong>AJAX</strong> Control Toolkit. Elegimos<br />

AjaxControlToolkit.dll y presionamos sobre “open”.<br />

Y a los tenemos instalados. Estos controles van desde un simple botón con una alerta<br />

asociada, hasta un complejo panel que podemos arrastrar por la pantalla; en ambos casos,<br />

mandando y recogiendo información entre el cliente y el servidor sin ningún tipo de recarga de<br />

página. Su uso hará que nuestra Web sea mucho más atractiva y simpática al usuario a la par<br />

que potente y efectiva.<br />

Para saber que es y cómo funciona acudiremos a la web<br />

http://www.es-asp.net/tutoriales-asp-net/tutorial-5312-5317/controles-y-extendedores.aspx<br />

http://www.asp.net/ajaxlibrary/AjaxControlToolkitSampleSite/asyncfileupload/asyncfileuploa<br />

d.aspx<br />

(Ejemplo) ValidatorCalloutExtender<br />

El ValidatorCallout es un extendedor de cualquier tipo de validador (RequiredFieldValidator,<br />

RangeValidator, CustomValidator...), con el que conseguimos una vista mucho más amable de<br />

los típicos validadores.<br />

No tenemos que aplicar los validadores como lo hemos hecho hasta ahora, pero con el detalle<br />

de añadirles el atributo Display=”None” y asignarles el ValidatorCalloutExtender.<br />

Para que funcione correctamente, en lugar de poner<br />

hay que poner<br />

<br />


Programación avanzada en .NET con C#<br />

Servicio de Informática<br />

Propiedades<br />

• TargetControlID: ID del Validador que se está extendiendo.<br />

• Width: Anchura del Callout<br />

24<br />

<strong>AJAX</strong><br />

• HighlightCssClass: Opcionalmente se puede asignar una clase CSS sobre el Callout.<br />

• WarningIconImageUrl: Url del icono que muestra la alerta. Si no se especifica se muestra el<br />

que viene por defecto.<br />

• CloseImageUrl: Imagen que produce el cierre del Callout<br />

Ejemplo 7 (Callout)<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!