Capitulo 2 - Programación en Web Forms

download Capitulo 2 - Programación en Web Forms

of 34

description

ASP.NET Programación con C#

Transcript of Capitulo 2 - Programación en Web Forms

2. Programacin en Web Forms 2.1. Acceso a Datos de usuarioUna de las operaciones ms importantes y habituales que se realizan en una aplicacin Web es el acceso a los datos enviados por el usuario desde una pgina cliente, datos que viajan en la peticin HTTP lanzada desde el cliente. En ASP .NET estos datos son recogidos por una pgina aspx y la forma de acceder a ellos desde el cdigo de la clase Page depender del mecanismo utilizado en la pgina cliente para su A continuacin, analizaremos los diferentes escenarios que pueden tener lugar.

2.1.1. Captura de datos mediante controles Web ASP.NET proporciona un buen nmero de controles Web para solicitar datos al usuario mediante una pgina aspx. Cuando se produce la recarga de la pgina, los datos capturados por estos controles son enviados a la misma a travs de la peticin HTTP, pudiendo ser recuperados desde el interior de los mtodos de Page a travs de las propiedades expuestas por los controles. Por ejemplo, el control Web de tipo TextBox representa una caja de texto para introduccin de datos; utilizando su propiedad Text es posible recuperar en el cdigo del servidor el valor introducido por el usuario.

2.1.2. Captura de datos mediante controles HTML Como ya sabemos, una pgina aspx puede contener tambin controles HTML. En el caso de que estos funcionen como controles de servidor, la forma de recuperar los datos capturados por ellos ser la misma que en el caso de los controles Web, es decir, utilizando las propiedades del control desde cdigo de servidor. Sin embargo, si el control HTML funciona como control de cliente no ser posible acceder a sus propiedades desde cdigo de servidor. En ese caso, habr que recurrir al objeto Request de ASP para acceder a los datos capturados por el control.

Captulo 2. Programacin en Web Forms

Pgina 1

Propiedad Form del objeto Request Todos los controles, tanto Web como HTML que se incluyen en un formulario Web, quedan delimitados dentro de una etiqueta , a fin de que sus valores sean enviados a la pgina cuando se produzca la recarga de la misma. La propiedad Form del objeto Request contiene la coleccin con los datos de los controles enviados por el formulario en la peticin. Cada uno de estos datos tiene asociado un nombre, que es el atributo name asignado al control, y un valor de tipo string, que es el atributo value de este dato. As pues, para acceder a cada uno de los valores enviados por los controles desde la clase Page podemos hacer uso del indizador de la coleccin Form de Request, utilizando como clave el nombre del control: this.Request.Form["nombre_control "] Si el nombre indicado no existe o el control no tiene valor, la expresin anterior devolver null. Para comprobar el funcionamiento de esta propiedad, vamos a sustituir el control Web de tipo TextBox de la pgina aspx del ejemplo anterior por un control HTML de tipo Text y a su propiedad/atributo name le daremos el valor "tbxTexto", lo cual puede hacerse directamente a travs de la ventana de propiedades de Visual Studio. Captura de datos desde una pgina HTML Hasta ahora hemos supuesto que todas las pginas que componen una aplicacin ASP.NET son de tipo aspx; sin embargo, podemos encontramos ante situaciones en las que una pgina aspx debe interaccionar con una pgina HTML, ya sea estando ambas en la misma aplicacin o en aplicaciones diferentes. En esta interaccin puede darse la situacin de que la pgina HTML tenga que capturar una serie de datos mediante una serie de controles HTML para enviarlos a una pgina aspx que los debe procesar. En este caso, desde el punto de vista de la pgina aspx que va recibir los datos, estamos ante la misma situacin que en el escenario anterior, es decir, utilizando la propiedad Form del objeto Request accederemos a los datos enviados por los controles HTML de la pgina. Ejemplo: Uso FormHTML. Esta prctica consiste en la creacin de una aplicacin que solicite una serie de datos al usuario a travs de un formulario HTML, para despus enviarle una pgina de respuesta en la que se le muestra una especie de resumen de la informacin solicitadaCaptulo 2. Programacin en Web Forms Pgina 2

La aplicacin estar formada por una pgina HTML que se encargue de la captura de los datos y de una pgina aspx que realizar el procesamiento de los mismos y generar la respuesta al usuario. Para el desarrollo de la pgina HTML podemos utilizar cualquier editor de texto o diseador HTML. Una vez creada la pgina, para agregada a la aplicacin Web Site de ASP.NET, nos situaremos en el explorador de soluciones sobre el nombre del Web Site y pulsando el botn derecho del ratn accederemos al men contextual, donde elegiremos la opcin Agregar Elementos Existentes. Despus de aadida, para que pueda ser invocada en primer lugar al ejecutar la aplicacin desde Visual Studio.NET, nos situaremos sobre ella en el explorador de soluciones y en el men contextual elegiremos la opcin Establecer como pgina de inicio. Datos insertados en la URL No toda la informacin suministrada a la aplicacin Web desde una pgina cliente es proporcionada a travs de controles Web/HTML de usuario. En numerosas ocasiones, la pgina necesita enviar ciertos datos a la aplicacin que, sin ser introducidos de forma explcita por el usuario, sirven para notificar aquella determina informacin asociada a este. Para ello, estos datos deben ser insertados directamente en las URLs de los enlaces o formularios que apuntan a la pgina aspx que debe recibirlos en la peticin, siguiendo el formato: nombre pagina.aspx ? nombre_dato = valor & nombre_dato=valor Los datos as enviados viajan en parejas nombre_dato = valor, donde nombre_dato es un nombre asignado al dato y valor es el valor asociado al mismo. Para recoger esta informacin desde la clase Page de la pgina solicitada, volvemos a recurrir al objeto Request, slo que ahora debemos emplear su propiedad QueryString en vez de Form. QueryString contiene la coleccin de datos enviados en la URL de la peticin, disponiendo de un indizador para acceder de forma individualizada a los valores de los mismos a partir de su nombre: this.Request.QueryString["nombre_dato]; Al igual que sucede con la coleccin Form, el valor del dato devuelto por QueryString es una cadena de caracteres. Practica: En una pgina aspx situaremos un control de tipo Label (lbltexto) en el que incluiremos un texto de prueba. Si lo deseamos, a travs de

Captulo 2. Programacin en Web Forms

Pgina 3

la ventana de propiedades de Visual Studio podemos modificar la propiedad Font del objeto Label para aumentar el tamao del texto. En la misma pgina incluiremos tres enlaces HTML con los tres colores a utilizar. Para hacer esto, entraremos en la vista HTML de la pgina aspx e introduciremos manualmente las etiquetas HTML, incluyendo como dato en la URL que apunta a la pgina aspx el nombre del color en ingls:Rojo
Azul
Verde

Como los enlaces HTML del .aspx apuntan a la propia pgina, ser en el mtodo de respuesta al evento Load de Page donde programaremos las instrucciones para colorear el texto del control Label. El cdigo deber tener en cuenta que la primera vez que se produzca el evento Load no ser por la activacin de un enlace, sino por la entrada directa en la pgina desde el navegador. Esto ser controlado comprobando el valor recibido en el parmetro color, pues si su valor es null significar que no se ha activado ningn enlace y por tanto la llegada a la pgina se ha producido mediante la introduccin de su URL en la barra de direcciones del navegador. Es importante destacar a raz de este ejercicio que, a pesar de que se vuelve a reproducir todo el ciclo de vida de la pgina cuando es solicitada mediante la activacin de un enlace, este suceso no es considerado como una recarga de la misma. Esto significa que no tendra sentido hacer uso de la propiedad IsPostBack de Page para distinguir entre la ejecucin por solicitud directa desde el navegador y la ejecucin por activacin de un enlace, ya que en ambos casos el valor de la propiedad sera false. nicamente se considera recarga de la pgina cuando la solicitud de la misma se produce como consecuencia de un evento generado sobre un control de servidor (Web o HTML).

2.1.3. Transferencia de peticiones y redireccionamiento En los ejemplos prcticos que se han venido presentando hasta el momento, la pgina aspx que solicita los datos al usuario es la misma que presenta los resultados de la ejecucin. El motivo de esto no es otro que el proceso de recarga de pginas que tiene lugar cuando se producen ciertos eventos en los controles de servidor de las mismas, ya que, como se puede apreciar en la vista HTML de cualquier pgina aspx, la etiqueta que contiene a los controles no hace uso delCaptulo 2. Programacin en Web Forms Pgina 4

atributo action, provocando que se vuelva a solicitar la misma pgina cuando tenga lugar el submit. En ms de una ocasin, sera deseable que los datos fueran recogidos en una pgina y los resultados del procesamiento se mostrasen en otra. Por ejemplo, en la prctica de la tabla de multiplicar de un nmero, la tabla resultante se visualizaba en la misma pgina aspx donde se produca la captura del nmero, pudiendo resultar ms lgico mostrarlo en una pgina diferente. Para conseguir esto, la solucin pasa por transferir la peticin o hacer un redireccionamiento a otra pgina durante la recarga de la pgina aspx que recoge los datos. Ver esquema Proceso de paso de control entre pginas en ASP. Aunque transferencia de peticin y redireccionamiento son procesos diferentes, bsicamente ambos consisten en pasar el control del programa desde la pgina solicitada por el usuario a otra diferente, pudiendo ambas pginas realizar parte del procesamiento de la peticin.Proceso de paso de control entre pginas en ASPPeticin 1 Pagina1.aspx

Instancia

Respuesta 1 Pagina1.aspx Peticin 2 (PostBack)

Instancia

Transferencia / Redireccionamiento

Pagina2.aspx

Instancia

A continuacin vamos a analizar con detalle la manera de realizar cada una de estas operaciones y las consecuencias derivadas en cada caso.

Captulo 2. Programacin en Web Forms

Pgina 5

Transferencia de una peticin Como su nombre indica, consiste en transferir la peticin HTTP que llega a una pgina hacia otra, operacin que se realiza desde los mtodos de respuesta a eventos de la pgina inicial. Una vez recibida la peticin por parte de la segunda pgina, esta continuar con el procesamiento de la misma, pudiendo optar por enviar la respuesta al usuario o devolver el control a la pgina inicial para que sea ella la encargada de responder. En ambos casos, los datos enviados por el usuario en la peticin estarn accesibles tambin para la segunda pgina a travs del objeto Request. La transferencia de una peticin se realiza a travs del objeto Server de ASP. Para ello, dicho objeto proporciona los siguientes mtodos: void Transfer (String url). Transfiere la peticin a la pgina cuya URL relativa se especifica como argumento. Al completar su ciclo de vida, esta pgina ser la encargada de generar la respuesta al usuario. void Execute (String url). Transfiere la peticin a la pgina cuya URL relativa se especifica como argumento. En este caso, una vez completado su ciclo de vida, la pgina devolver el control a la pgina aspx inicial para que sea esta la encargada de generar la respuesta.

Captulo 2. Programacin en Web Forms

Pgina 6

Esquema: Diferencias entre Transfer y ExecuteProceso de paso de control de una pgina a otra con Transferencia y Redireccionamiento en ASPPeticin 1 Pagina1.aspx

Proceso de paso de control mediante ExecutePeticin 1 Pagina1.aspx

Instancia

Instancia

Respuesta 1 Pagina1.aspx Peticin 2 (PostBack)

Respuesta 1 Pagina1.aspx Transferencia / Redireccionamiento Peticin 2 (PostBack)

Instancia

Instancia

Pagina2.aspx

Pagina2.aspx

Instancia

Instancia

Para realizar una transferencia y Execute usamos el objeto Server de ASP: Sintaxis Transferencia: this.Server.Transfer(Otrapagina.aspx); Sintaxis Execute: this.Server.Execute(Otrapagina.aspx); Para Redireccionamiento usamos el objeto Response de ADO: Sintaxis: this.Response.Redirect(Otrapagina.aspx);Captulo 2. Programacin en Web Forms Pgina 7

En el esquema Diferencias entre Transfer y Execute, se ilustra la diferencia de funcionamiento entre ambos mtodos y la manera en la que se ve afectado el encaminamiento de la peticin. Como se puede ver, tras la ejecucin de Transfer() el control del programa no es devuelto a la pgina inicial, por lo que las instrucciones que pudieran aparecer despus de la llamada a este mtodo nunca se ejecutarn. En el caso de Execute(), cuando la segunda pgina completa su ejecucin, el control del programa pasa a la primera pgina, concretamente, a la instruccin que aparece inmediatamente despus de Execute(). En ambos casos, la pgina que recibe la peticin se procesa igual que si hubiera sido solicitada directamente por el usuario, generndose dinmicamente la dll con las clases Page y completndose el ciclo de vida de la pgina. Ejemplo Uso ValidacionUsuarios En este ejemplo vamos a desarrollar la tpica pgina para validacin de usuarios. En ella, el usuario introducir su nombre y password. Si el password es correcto, se mostrar una pgina de bienvenida y si no lo es, se indicar que el valor suministrado como password no es correcto. En el caso de que el usuario sea vlido, la pgina de bienvenida deber mostrar el nombre de este junto con el mensaje. De manera similar, la pgina de error donde se le dice que el password introducido no es correcto deber mostrar tambin el valor de este. La aplicacin estar formada por tres pginas aspx. La primera de ellas, Default.aspx, ser la encargada de solicitar los datos al usuario. En el mtodo de respuesta al evento Click del botn se comprobar si el password introducido es correcto (se utilizar internamente una constante de cadena cualquiera como valor de password); si lo es, se transferir la peticin a Valido.aspx, donde se mostrar un mensaje de bienvenida con el nombre del usuario; si no lo es, la peticin ser transferida a Error.aspx, donde se le mostrar el password incorrecto introducido. Por otro lado, el control Web de tipo TextBox, dispone de una propiedad llamada TextMode que permite indicar el tipo de entrada de texto que se va a solicitar. Si a travs de la ventana de propiedades establecemos el valor password en esta propiedad para la caja de texto que solicita dicho dato, los caracteres introducidos por el usuario sern visualizados como "*, en vez de mostrarse su valor real. Como hemos visto, la pgina a la que se transfiere la peticin no puede acceder a las propiedades de los controles Web de la primera pgina, comoCaptulo 2. Programacin en Web Forms Pgina 8

alternativa para recuperar los datos de usuario y, dado que esos datos han sido capturados tambin desde un formulario HTML, se recurre a la propiedad Form del objeto Request.

2.1.4. Compartir datos entre pginas de una misma peticin Adems de los datos de usuario, las dos pginas que tratan la peticin durante un proceso de transferencia pueden necesitar compartir otro tipo de informacin. Por ejemplo, la pgina inicial que recibe la peticin podra acceder a una base de datos para recuperar algn tipo de informacin, informacin que tambin debera estar disponible para la pgina a la que se va a transferir la peticin. Como la instancia de la pgina inicial sigue en memoria cuando se transfiere la peticin a la segunda, el problema podra resolverse si desde esta se pudiera obtener una referencia a aquella. Esto es posible gracias al objeto Context de ASP. Context representa el contexto de ejecucin de una pgina y entre sus propiedades est Handler, la cual contiene una referencia al objeto Page que recibe inicialmente la peticin. As pues, si en la pgina inicial se almacena el dato que se quiere compartir en una propiedad pblica de la clase, la segunda pgina podr acceder fcilmente a este, tal y como queda ilustrado en el ejemplo:Pagina1.aspxPublic partial class Pagina1: Page { int x= 25; this.Numbers = x; This.Server.Transfer(Pagina2.aspx); }

Pagina2.aspxPublic partial class Pagina2: Page { int p; Pagina1 pg; Pg = (Pagina1)this.Context.Handler; p = pg.Number; }

Almacenar la informacin Recuperar la informacin

Redireccionamiento La transferencia de una peticin desde una pgina a otra slo puede realizarse si ambas pginas pertenecen a la misma aplicacin ASP.NET (Web Site). Si la pgina aspx que recibe la peticin tiene que pasar el control a otraCaptulo 2. Programacin en Web Forms Pgina 9

pgina (aspx, html o asp) de una aplicacin diferente, debera realizar un redireccionamiento. Como su nombre indica, un redireccionamiento consiste en redireccionar al usuario a otra URL diferente a la que este ha solicitado. Esta operacin se lleva a cabo mediante el mtodo Redirect() del objeto Response de ASP y su formato es el siguiente: void Redirect (String url) Donde la cadena url representa la URL de la pgina a donde ser redireccionado el usuario. Si la pgina se encuentra en otra aplicacin (caso habitual) la URL debe ser absoluta. En caso de que la pgina redireccionada est en la misma aplicacin puede hacerse, aunque en estos casos es preferible utilizar Transfer() o Execute() la URL ser relativa.

Esquema de Redireccionamiento de una pgina a otra

Peticin 1

Pagina1.aspx Instancia

Redirect(Pagina2.aspx) Peticin 2

Pagina2.aspx Instancia

Como se puede comprobar, durante el redireccionamiento la pgina que recibe la peticin inicial realiza la llamada al mtodo Redirect(). Al ejecutarse esta instruccin, finaliza el proceso de ejecucin de la Pagina1 y se enva la respuesta HTTP al cliente de forma inmediata. En ella se incluye un encabezado que fuerza al navegador a realizar la peticin de la pagina2.aspx, antes de llegar a procesar el cuerpo de la respuesta. Este proceso es totalmente transparente para el usuario, que lo nico que aprecia es que la direccin que aparece en su navegador cambiaCaptulo 2. Programacin en Web Forms Pgina 10

repentinamente, accediendo a una URL distinta a la que haba solicitado en un principio. Segn lo que se acaba de explicar, el proceso de redireccionamiento supone que para que el usuario llegue a la pgina destino debe realizar dos peticiones HTTP. Esto, adems de suponer un retardo adicional respecto a la transferencia de peticiones, donde el usuario realizaba una nica peticin a la aplicacin, implica que tanto los datos que llegan en la primera peticin a la pgina inicial como los que esta genera no estarn accesibles para la segunda pgina. En caso de que las dos pginas involucradas en un redireccionamiento necesiten compartir datos, estos debern ser insertados en la URL utilizada como argumento del mtodo Redirect(), tal y como se ilustra en el ejemplo: En Pagina1.aspx: int num = 5; this.Response.Redirect(Pagina2.aspx?dato= + num); En Pagina2.aspx: int valor = int.Parse(this.Request.QueryString[dato]);

2.1.5. Acceso a Informacin sobre el Cliente Adems de los datos de usuario, las peticiones HTTP incluyen otro tipo de informacin en la cabecera que puede resultar de gran inters para la aplicacin. Entre dicha informacin podemos encontrar por ejemplo la direccin IP del cliente que realiza la solicitud, el nombre y versin del navegador utilizado, los tipos de formato de respuesta aceptados por este, etc. Esa informacin puede resultar enormemente til de cara a personalizar las aplicaciones segn las caractersticas y capacidades de cada cliente. Para acceder a esta informacin desde cdigo, el objeto Request de ASP proporciona diversas propiedades. A continuacin vamos a analizar algunas de las ms significativas: HttpMethod. Contiene una cadena de caracteres que indica el mtodo utilizado por la peticin; su valor puede ser "GET", "POST" o "HEAD". UserHostAddress. Contiene una cadena de caracteres con la direccin IP del cliente. Browser. Contiene un objeto HttpBrowserCapabilities que almacena informacin sobre las caractersticas del navegador que realiza la peticin. Entre las propiedades de este objeto estn:Captulo 2. Programacin en Web Forms Pgina 11

Browser. Contiene una cadena de caracteres con el nombre del navegador. Version. Contiene un nmero entero con la versin del navegador. Cookies. Valor de tipo bool que indica si el navegador admite o no cookies. JavaScript. Valor de tipo bool que indica si el navegador admite o no JavaScript. Frames. Valor de tipo bool que indica si el navegador admite o no Frames. SupportsCss. Valor de tipo bool que indica si el navegador admite o no hojas de estilo CSS. IsMobileDevice. Valor de tipo bool que indica si se trata de un micronavegador de dispositivo mvil. Es una propiedad muy til para aquellas aplicaciones que pretenden servir contenidos, tanto para equipos de sobremesa como para terminales Wireless (telfonos mviles, agendas, etc.). PreferredRederingMime. Contiene una cadena de caracteres con el tipo de formato de respuesta preferido por el cliente. Tambin es una propiedad muy til para la personalizacin de aplicaciones. ServerVariables. Contiene la coleccin de variables de servidor. Las variables de servidor son, como su nombre indica, variables de entorno del servidor Web donde se almacena informacin, tanto acerca del navegador que realiz la peticin como del propio servidor. Gran parte de la informacin proporcionada por las propiedades anteriores se encuentra tambin disponible en las variables de servidor. La coleccin ServerVariables es una coleccin de tipo NameValueCollection, donde cada elemento almacenado tiene asociado un nombre o clave que lo identifica. A travs de la propiedad AllKeys de este tipo de coleccin podemos acceder al array de nombres de todos los elementos almacenados, lo que facilita el recorrido de la misma a travs de un bucle foreach y el indizador de la coleccin. Ejemplo Uso VariablesCliente: foreach(string objVar in this.Request.ServerVariables.AllKeys) { this.Request.ServerVariables[objVar] }

Captulo 2. Programacin en Web Forms

Pgina 12

2.2. Mantenimiento de Estado en ASPHTTP es un protocolo que trabaja en modo desconectado. Esto significa que tras recibir una respuesta a una peticin realizada, el cliente se desconecta del servidor, eliminando este de su memoria toda la informacin manejada por aquel durante el procesamiento de la peticin. En ASP.NET, como sabemos, esto se traduce en que la instancia de la clase Page creada para atender la peticin de una pgina es destruida despus de enviar la respuesta al cliente, perdindose la informacin manejada por esta. Esta "perdida del estado" del cliente supone una gran limitacin en muchos escenarios donde es necesario que los datos manejados durante una peticin estn disponibles para instancias de otras peticiones. ASP.NET proporciona diversas tcnicas para preservar los datos entre peticiones, cuyas instancias pueden estar asociadas a una misma pgina, a distintas pginas e incluso a distintos clientes. Estas tcnicas son: Insercin de datos en URL. Variables de tipo ViewState. Variables de sesin. Cookies. Variables de aplicacin. Seguidamente, vamos a analizar con detalle el funcionamiento de cada una de estas tcnicas y sus principales contextos de utilizacin.

2.2.1. Inserccin de datos en URL Ya pudimos ver anteriormente esta tcnica para resolver el problema de la perdida de datos que se produce al redireccionar a un usuario a otra pgina. Como vimos, bsicamente consiste en anexar en la cadena URL de la pgina destino que se utiliza como argumento del mtodo Redirect() los datos que dicha pgina necesita utilizar, datos que podrn ser recuperados a travs de la propiedad QueryString del objeto Request. Esta tcnica resulta bastante til cuando se tienen que compartir una pequea cantidad de datos entre dos pginas .aspx; sin embargo, puede resultar bastante engorrosa de utilizar y propensa a errores cuando los datos tienen que ser transferidos entre varias pginas.

Captulo 2. Programacin en Web Forms

Pgina 13

2.2.2. Variables de tipo ViewState ViewState es una tcnica utilizada por ASP.NET que permite almacenar datos en la propia vista de la pgina, de modo que puedan estar accesibles durante todas las recargas que un determinado cliente realiza de la misma. Estos datos son almacenados por la aplicacin como cadenas de caracteres en campos ocultos HTML antes de enviar la respuesta al cliente, as, cuando se produce la recarga de la pgina, los datos son enviados de nuevo al servidor, por lo que estarn disponibles para la nueva instancia de Page. A travs de la propiedad ViewState de la clase Page tenemos acceso a la coleccin de datos almacenados de esta forma. Cada uno de estos datos, denominados habitualmente como variables ViewState, tienen asociado un nombre y un valor, pudiendo utilizar el indizador con el nombre de la variable para acceder al valor. As pues, para almacenar un valor en una variable ViewState se debe utilizar la expresin: this.ViewState["nombre _variable "] =valor; Siendo nombre_variable el nombre que se le da a la variable y valor el objeto almacenado. La coleccin ViewState almacena las referencias como object, por lo que a la hora de recuperar el contenido de una variable ViewState durante la recarga de la pgina se deber de realizar una conversin explcita al tipo original almacenado. Utilizar esta sintaxis: tipo variable =(tipo)this. ViewState["nombre _variable "]; Hay que destacar, adems, que a pesar de que las variables ViewState admiten valores de tipo objeto, slo aquellos tipos de objeto que admitan ser serializados (por ejemplo, todos los tipos bsicos de C#) podrn almacenarse en una variable ViewState, pues son convertidos a cadena de caracteres antes de ser almacenados en los campos ocultos. Todos los controles Web cuentan con un ViewState asociado que permite mantener entre recargas de la pgina los valores establecidos en las propiedades de los controles desde la pgina cliente. Este es el motivo por el cual un control TextBox mantiene el valor introducido por el usuario en la caja de texto cuando se produce la recarga de la pgina. Los controles HTML, en cambio, no disponen de esta capacidad, por lo que, aunque funcionen como controles de servidor, no podrn mantener los

Captulo 2. Programacin en Web Forms

Pgina 14

valores establecidos en la vista del control al producirse la recarga de la pgina.

2.2.3. Variables de Sesin y el objeto Session Las variables de tipo ViewState tienen dos importantes limitaciones: Slo permiten conservar datos entre instancias de una misma pgina y; no podemos almacenar objetos de cualquier clase. Si nuestra aplicacin necesita mantener objetos de clases no serializables o debe tener algn dato accesible para distintas pginas de la misma, hemos de recurrir a otra solucin para el mantenimiento del estado, como puede ser la utilizacin de variables de sesin. La sesin es un concepto asociado al uso que un determinado cliente realiza de una aplicacin Web. Se puede decir que un cliente da por comenzada una sesin en la aplicacin en el momento en que realiza una peticin de cualquiera de los recursos asociado a la misma (pginas html, aspx o asp). A partir de ese instante, todas las solicitudes posteriores que ese cliente realice a algn otro elemento de la aplicacin pertenecern a la misma sesin. La sesin se dar por finalizada cuando tenga lugar alguno de los siguientes sucesos: El usuario cierra el navegador cliente. El cliente sobrepasa el periodo mximo de inactividad. El periodo mximo de inactividad es el tiempo mximo que un cliente puede permanecer sin realizar solicitudes a la aplicacin. Si se supera, la sesin se da por concluida y todos los datos asociados a la misma se perdern, por lo que la siguiente peticin que realice dar comienzo a una nueva sesin. Este periodo mximo de inactividad depende del servidor Web donde se aloje la aplicacin, estando establecido en 20 minutos para el Internet Information Services (IIS). No obstante, como veremos ms adelante, ASP.NET dispone de diversos mecanismos para configurar este tiempo a nivel de aplicacin. Objeto Session y variables de sesin El objeto Session de ASP permite gestionar las sesiones de los usuarios durante la ejecucin de una aplicacin ASP.NET. Su principal funcionalidad es la de proporcionar acceso a las variables de sesin.Captulo 2. Programacin en Web Forms Pgina 15

Las variables de sesin son espacios de memoria del servidor, donde una aplicacin puede almacenar datos que estn accesibles para todas las instancias de las pginas a las que un determinado usuario accede durante la sesin. Desde cualquiera de las pginas aspx de la aplicacin, se puede acceder a la coleccin de variables de sesin del usuario actual a travs del indizador del objeto Session. Sintaxis: this.Session["nombre _variable''] Siendo "nombre variable" el nombre de la variable de sesin. A la hora de recuperar el contenido de una variable de sesin, hay que tener en cuenta que la expresin anterior devuelve un object, por lo que, al igual que sucede con las variables ViewState, ser necesario realizar una conversin explcita o casting al tipo destino. Ejemplo: this. Session ["numero"] =5; int p = (int)this.Session["numero"]; En caso de que no exista una variable de sesin con el nombre especificado, la expresin this.Session["nombre_variable"] contendr null Aunque una variable de sesin pueda constituir una solucin ms sencilla para el mantenimiento del estado que la insercin de datos en la URL o las variables ViewState, supone un coste de recursos de memoria del servidor. Por ello, este tipo de variables debe ser utilizado slo cuando sea realmente necesario ya que un uso desmesurado de las mismas puede provocar una prdida importante de rendimiento en la aplicacin, especialmente cuando existe un elevado nmero de usuarios accediendo a ellas. Control de sesiones Adems de proporcionar acceso a las variables de sesin, el objeto Session dispone de una serie de propiedades y mtodos que permiten realizar desde cdigo un uso efectivo de las sesiones. Seguidamente, comentaremos algunos de los ms importantes. Timeout. Esta propiedad permite recuperar y establecer el periodo mximo de inactividad para la sesin actual. Su valor viene definido en minutos y nunca podr ser superior a 525.600, que es el nmero de minutos equivalente a un ao. La siguiente instruccin establece un periodo mximo de inactividad de 10 minutos para la sesin del usuario que ejecute la instruccin: this.Session.Timeout= 10;Captulo 2. Programacin en Web Forms Pgina 16

Un valor reducido para esta propiedad puede hacer ms eficiente la aplicacin al disminuir los recursos de memoria de servidor utilizados. Sin embargo, un valor demasiado bajo tambin podra deteriorar el rendimiento de la misma, por ello, esta propiedad deber ser ajustada en funcin de las caractersticas de cada aplicacin. Este valor puede ser establecido tambin de forma general para todas las sesiones a travs del elemento del archivo de configuracin web.config, que estudiaremos ms adelante. Abandon(). Invocando a este mtodo se invalida la sesin actual, haciendo que todas las variables de sesin asociadas sean destruidas. Se debe llamar a este mtodo cada vez que quiera darse por concluida la sesin del usuario. Remove(String Name). Este mtodo permite eliminar de la sesin actual la variable cuyo nombre se especifica.

2.2.4. Variables de Aplicacin Las variables de sesin nos permiten mantener informacin accesible a todas las pginas aspx que un determinado cliente utiliza durante una sesin. Dado que cada sesin tiene su propio juego de variables, no es posible utilizar el objeto Session para compartir informacin entre los distintos clientes de la aplicacin. Para ello, ASP.NET proporciona las variables de aplicacin. El objeto Application y las variables de aplicacin El objeto Application de ASP es un objeto compartido por todos los usuarios de la aplicacin, es decir, todas las peticiones que esta recibe comparten la misma instancia Application. A travs de este objeto se puede acceder a las variables de aplicacin, mediante las cuales se puede compartir informacin entre todos los usuarios que tengan una sesin activa en la aplicacin. Al igual que Session, el objeto Application proporciona un indizador para acceder a la coleccin de variables de aplicacin: this.Application["nombre _variable "]

Captulo 2. Programacin en Web Forms

Pgina 17

Las variables de aplicacin pueden contener cualquier objeto de C#, almacenndose como tipo object. Dado que este objeto es compartido por todos los usuarios de la aplicacin, deberamos disponer de un mecanismo que evitara posibles conflictos cuando dos usuarios intentan acceder al objeto al mismo tiempo. Dicho mecanismo consiste simplemente en invocar al mtodo Lock() del objeto Application. La llamada a este mtodo por parte de un usuario hace que se bloquee el acceso a Application para otros usuarios, quedando estos a la espera hasta que se produzca la liberacin del objeto, accin que se realiza a travs del mtodo UnLock(). As pues, para realizar una operacin de escritura en una aplicacin debera bloquearse el acceso al objeto Application antes operacin: int c = 10; Application.Lock(); Application[Contador] = c+ 2; Application.UnLock();

Eventos de Aplicacin Llegados a este punto, antes de estudiar la ltima de las tcnicas para el mantenimiento del estado en una aplicacin Web, puede resultar interesante presentar unos tipos de eventos cuya captura es bastante til en algunos tipos de aplicaciones. Se trata de los eventos de aplicacin, llamados as porque se producen en el mbito de aplicacin durante el ciclo de vida de esta, en vez de a nivel de pgina como sucede con los eventos que hemos estudiado hasta el momento. Los mtodos de respuesta a este tipo de eventos se codifican en un archivo especial de aplicacin llamado Global.asax. El archivo Global.asax y los eventos de aplicacin De forma predeterminada, las aplicaciones ASP.NET creadas con Visual Studio 2008 no incorporan el archivo Global.asax. Para aadirlo, nos situaremos con el ratn en el explorador de soluciones y sobre el nombre del proyecto pulsaremos el botn derecho, eligiendo la opcin Agregar Nuevo Elemento del men contextual. Al hacer esto aparecer el cuadro de dilogo, donde seleccionaremos la plantilla Global Application Class. Como podemos comprobar, el nombre predeterminado que aparece en el cuadro de dilogo al elegir esta plantilla es Global.asax. Despus de pulsarCaptulo 2. Programacin en Web Forms Pgina 18

el botn Agregar, veremos en el explorador de soluciones como el archivo se ha aadido al proyecto. Al abrir el archivo Global.asax veremos un script de servidor en el que estn incluidos los mtodos de respuesta a los distintos eventos de aplicacin. En tiempo de ejecucin, este archivo es transformado en una subclase de HttpApplication que es compilada dentro de la dll de la aplicacin. Entre los eventos de aplicacin ms importantes estn: Application_Start. Se produce cuando tiene lugar la primera solicitud de cualquiera de las pginas de la aplicacin, momento en el que comienza su ciclo de vida. El mtodo de respuesta a este evento suele utilizarse para realizar tareas tales como la inicializacin de variables de aplicacin o la carga inicial de datos. Session_Start. Se produce cada vez que un usuario comienza una nueva sesin en la aplicacin, emplendose este evento para inicializar variables de sesin. Session_End. Se produce cuando se da por finalizada una sesin de usuario, por lo que se suele utilizar para realizar tareas de limpieza y liberacin de recursos. Application_End. Este evento tiene lugar cuando la aplicacin va a ser descargada de memoria. No es posible predecir el momento exacto en que Application_End ser disparado, pero suceder a partir del momento en que todas las sesiones hayan finalizado. Como Session_End, Application-End suele emplearse para realizar tareas de limpieza. Ejemplo: Uso Mensajeria

2.2.5. Cookies Cuando una aplicacin necesita mantener informacin de un usuario ms all del tiempo que dura una sesin, puede recurrir a la utilizacin de cookies. Una cookie es una especie de variable de tipo cadena de caracteres que es enviada al cliente a travs de la cabecera de la respuesta HTTP generada por la aplicacin, y que este almacena en un archivo de texto de su disco duro. Posteriormente, cuando el cliente vuelva a realizar una nueva solicitud de alguna de las pginas aspx de la aplicacin, enviar de nuevo la cookie alCaptulo 2. Programacin en Web Forms Pgina 19

servidor como parte de la cabecera de la peticin. Todo este proceso de recepcin y envo de cookies desde el cliente se realiza de forma transparente para el usuario. Dado que la cookie es almacenada en el disco duro del cliente, su contenido puede perdurar durante un largo periodo de tiempo, permitiendo a la aplicacin disponer de informacin relativa al usuario por un tiempo superior al de la duracin de la sesin. No obstante, antes de recurrir al uso de cookies en una aplicacin Web hemos de conocer las principales desventajas de su uso: Capacidad limitada. Una cookie no se puede utilizar para almacenar grandes cantidades de informacin, ya que su tamao mximo est limitado a unos cuantos bytes. Bajo nivel de seguridad. Al estar fuera del control del servidor, la informacin almacenada en una cookie no dispone de ningn tipo de proteccin. Por un lado, la privacidad de los datos es nula pues al estar almacenados en archivos de texto pueden ser ledos en el equipo cliente sin ningn tipo de dificultad, utilizando cualquier editor de textos. Por otro lado, nada impide que estos archivos sean eliminados por el usuario accidental o intencionadamente, hacindolos muy vulnerables. Inhabilitacin de cookies. Los navegadores pueden ser configurados por los usuarios para que no admitan cookies enviadas desde las aplicaciones. Esto implica que si la aplicacin hace uso de cookies para almacenar informacin clave, su funcionamiento podra ser deficiente en aquellos navegadores que tengan desactivado su uso. Como conclusin, las cookies pueden ser usadas para almacenar informacin sobre preferencias del usuario o para facilitar la navegacin por la aplicacin, pero nunca deben emplearse para almacenar informacin crtica. Creacin de una cookie y envo al cliente Desde el punto de vista de la aplicacin ASP.NET una cookie es un objeto de la clase Sytem.Web.HttpCookie. Para crearla utilizaremos el siguiente constructor: HttpCookie (String name, String value) Donde name es el nombre que se asignar a la cookie y value la cadena de caracteres que ser almacenada en la misma. Por ejemplo, la siguiente instruccin creara una cookie llamada "color" a la que se le asigna el valor "azul":Captulo 2. Programacin en Web Forms Pgina 20

HttpCookie ck = new HttpCookie ("color", "azul"); Una vez creada, se debe asignar a la cookie una fecha de caducidad en el cliente. Transcurrido ese periodo, la cookie ser eliminada por el cliente de forma automtica. La fecha de caducidad de una cookie se establece a travs de la propiedad Expires de la clase HttpCookie. Expires es una propiedad de tipo DateTime y, normalmente, se le suele asignar una valor relativo a la fecha actual. Por ejemplo, la siguiente instruccin establecera la caducidad de la cookie una semana despus de la fecha actual: ck.Expires = DateTime.Now.AddDays(7); Finalmente, la cookie debe ser aadida a la cabecera de la respuesta a fin de que pueda ser enviada al cliente cuando dicha respuesta se produzca. Esta operacin se lleva a cabo aadiendo la cookie a la coleccin de cookies del objeto Response: this.Response.Cookies.Add(ck); Recuperacin de una Cookie Cuando la cookie llega al cliente, el navegador almacena su contenido en un archivo de texto. Pero, como ya hemos mencionado antes, la cookie vuelve a ser enviada a la aplicacin cada vez que se solicita de nuevo alguna de las pginas aspx de esta. En este sentido hay que decir que un cliente slo enviar a la aplicacin las cookies que le pertenezcan, es decir, aquellas que previamente le hayan sido enviadas por la propia aplicacin. La informacin sobre la aplicacin propietaria de un cookie queda tambin almacenada en el fichero de texto, as como la fecha de caducidad y otro tipo de informacin encriptada que permite asegurar la integridad de la cookie. Para recuperar desde una pgina aspx las cookies enviadas por el cliente, recurriremos a la propiedad Cookies del objeto Request. Esta propiedad contiene la coleccin de objetos HttpCookie recibidos en la peticin, pudiendo utilizar el indizador para recuperar cualquiera de estos objetos a partir del nombre de la cookie. Por ejemplo, utilizando la siguiente instruccin en alguna de las pginas aspx de la aplicacin podramos recuperar la cookie color: HttpCookie ck = this.Request.Cookies[color];

Captulo 2. Programacin en Web Forms

Pgina 21

En caso de que no exista la cookie cuyo nombre se especifica, la instruccin anterior devolver null. Tras la recuperacin del objeto, recurriremos a la propiedad Value de HttpCookie para obtener el valor almacenado en la cookie: string col = ck.Value; Eliminacin de una cookie Una vez que se ha creado una cookie y ha sido enviada al cliente, esta no podr ser eliminada (desde cdigo, se entiende) hasta que caduque, envindose siempre desde el cliente a la aplicacin con cada peticin realizada. As pues, si queremos forzar a que una cookie sea eliminada por el cliente, debemos asignarle al objeto HttpCookie una fecha de caducidad anterior a la fecha actual y volvrselo a enviar al cliente en la respuesta. Por ejemplo: ck.Expires = DateTime.Now.AddDays(-1); Cookies de sesin Cuando analizamos anteriormente la utilizacin de las variables de sesin, indicamos que a la hora de recuperar el valor de estas desde cdigo la aplicacin utiliza la instancia de Session asociada al cliente en cuestin. Pero cmo puede la aplicacin identificar la instancia que se corresponde con cada cliente? La respuesta est en el hecho de que al crear la instancia de Session para ese cliente (hecho que se produce la primera vez que se asigna un valor a una variable de sesin durante la misma), se crea un identificador de sesin que es enviado al cliente con la respuesta HTTP. Este identificador es almacenado por el cliente en una cookie, conocida como cookie de sesin, de modo que es vuelto a enviar a la aplicacin cuando se realiza una nueva peticin a la misma desde ese cliente, permitiendo la identificacin de la sesin asociada al usuario. Esto debe ser tenido en cuenta por el programador, ya que el cliente podra tener desactivado el uso de cookies en su navegador y, por tanto, las variables de sesin podran no funcionar correctamente para ese cliente. Existe la posibilidad de evitar el uso de cookies para almacenar el identificador de sesin, insertando este en todas las URLs de las pginas que apuntan a algn recurso de la aplicacin. Esto se conoce como reescritura en URL.

Captulo 2. Programacin en Web Forms

Pgina 22

La reescritura de los identificadores de sesin en URL puede realizarse de forma automtica en ASP .NET a travs del archivo de configuracin Web.config. Tan slo es necesario indicar en el atributo cookieless del elemento el valor true : Ejemplo: Uso ValidacionRecuerdo

Captulo 2. Programacin en Web Forms

Pgina 23

2.3. El archivo WebConfigAdems de clases y pginas aspx, una aplicacin ASP.NET incluye un archivo de configuracin en el que se definen distintos parmetros relativos a la misma y que el servidor de aplicaciones utiliza durante su ejecucin. Este archivo de configuracin consiste en un documento XML en el que, mediante una serie de etiquetas predefinidas, se establecen los valores de los distintos parmetros configurables de la aplicacin. El nombre del archivo es Web.config y debe estar situado en el directorio raz de la aplicacin Web. Si nuestra aplicacin no incluye el fichero Web.config, para aadirlo, nos situaremos sobre el nombre del proyecto en explorador de soluciones y elegiremos Agregar Nuevo Elemento; despus, en el cuadro de dilogo, seleccionaremos la plantilla Archivo de Configuracion Web que, como podemos ver, tiene como nombre predeterminado Web.config. En caso de que no se aada un archivo Web.config a una aplicacin ASP.NET, esta tomar los valores de los parmetros establecidos de forma predeterminada para todas las aplicaciones ASP.NET. Como podemos ver en el documento XML que contiene el fichero Web.config, todos los parmetros se pueden configurar a travs de este documento. Todos estos parmetros son definidos dentro del elemento : Modo de Compilacin Cuando se compila una aplicacin ASP.NET con Visual Studio.NET, se debe especificar si la ejecucin de esta admitir o no depuracin a travs de entorno de desarrollo. Esta opcin se establece a travs del atributo debug del elemento , pudiendo ser su valor true (se admite depuracin) o false (no se admite depuracin). De forma predeterminada el valor establecido es false: Si se asigna el valor true a este atributo, podremos aplicar todas las tcnicas de depuracin proporcionadas por Visual Studio.NET para ayudamos en la deteccin de errores en la aplicacin, como son los puntos de parada o la inspeccin de variables. Sin embargo, la inclusin de los smbolos e instrucciones de depuracin en el programa compilado redunda en un peor rendimiento de la aplicacin, por lo que slo resulta conveniente trabajar con el modo de depuracin activado

Captulo 2. Programacin en Web Forms

Pgina 24

durante la fase de desarrollo. Antes de proceder a la distribucin de aplicaciones, se debera desactivar el modo de depuracin. Parmetros de Sesion El elemento . A travs del mismo podemos configurar diferentes aspectos sobre las sesiones, que se aplicarn de forma global a todos los usuarios de la aplicacin. De todos estos aspectos a configurar, nicamente hablaremos del periodo mximo de inactividad (timeout), que define el intervalo de tiempo que como mximo una sesin puede permanecer inactiva antes de que sea invalidada por el servidor. Su valor viene definido en minutos y se establece a travs del atributo timeout de la etiqueta. Por ejemplo, la siguiente lnea del Web.config establecera un periodo mximo de inactividad de 10 minutos para todas las sesiones de la aplicacin: El elemento no aparece de forma predeterminada en el archivo Web.config, debiendo ser aadido explcitamente de forma manual, siempre dentro del elemento . Pginas de Error Personalizadas ASP.NET proporciona unas pginas de error predefinidas para los distintos errores que el protocolo HTTP pueda generar durante el acceso a una aplicacin Web. Por ejemplo, si desde el navegador cliente solicitamos un recurso no existente dentro de la aplicacin, se producir el error HTTP nmero 404, envindose al usuario la pgina de error correspondiente. A travs del archivo de configuracin Web.config es posible redireccionar al usuario a pginas de error personalizadas para cada uno de los posibles errores HTTP que se puedan producir. Para ello se utiliza el elemento , en cuyo interior se indicar a travs de una serie de subelementos la direccin de la pgina html o aspx asociada a cada error. Por ejemplo, el siguiente bloque XML asocia las pginas de error personalizadas noexiste.html e inesperado.html para los errores HTTP 404 Y 500, respectivamente:

Captulo 2. Programacin en Web Forms

Pgina 25

Como vemos, el elemento dispone adems de los siguientes atributos: Mode. Indica el modo en que sern activados los errores personalizados. Sus posibles valores son: On: los errores personalizados estn activados. Off: los errores personalizados estn desactivados. RemoteOnly: los errores personalizado s estn activados solamente para clientes que acceden remotamente, no en modo local. DefaultRedirect. Indica la pgina a la que ser redireccionado el usuario cuando se produzca un error HTTP para el que no se ha definido una pgina especfica. El elemento aparece comentado de forma predeterminada en el archivo Web.config, por tanto, bastar con quitar los comentarios para poder utilizarlo. Parmetros de aplicacin personalizados Adems de los parmetros de configuracin de aplicaciones definidos por el .NET Framework, es posible crear parmetros propios para la aplicacin que permitan personalizar esta durante la fase de despliegue, utilizando estos parmetros para suministrar valores a la aplicacin desde el exterior sin tener que alterar el cdigo de la misma. Esto puede resultar prctico, por ejemplo, en aplicaciones que accedan a datos, donde la cadena de conexin con la base de datos puede cambiar del entorno de desarrollo al entorno de produccin. Si desarrollamos la aplicacin de manera que lea este dato del archivo Web.config en vez de tenerlo que suministrar desde cdigo, cada vez que haya que modificar la cadena de conexin el cambio se realizar directamente en el archivo y no en el cdigo. Definicin de parmetros personalizados Para suministrar parmetros personalizado s a travs de Web.config podemos hacer uso de los elementos y . Seguidamente comentaremos el primero de ellos, dejando el segundo para el captulo dedicado al acceso a bases de datos. En cualquier caso, tanto uno como otro debern ser incluidos directamente en el interior del elemento raz , fuera de la seccin . El elemento incluir tantos elementos como parmetros personalizado s se vayan a definir. Cada uno de estos elementos contar con los siguientes atributos:Captulo 2. Programacin en Web Forms Pgina 26

Key: Nombre del parmetro. Value: Valor establecido para el parmetro. Por ejemplo, la siguiente seccin definira un parmetro personalizado para suministrar en tiempo de despliegue la URL de un determinado recurso: Recuperacin del valor de un parmetro personalizado Para recuperar desde una pgina ASP.NET el valor establecido en la seccin en un parmetro personalizado, debemos hacer uso de la clase ConfigurationManager del espacio de nombres System.Configuration. Esta clase dispone de una propiedad esttica llamada AppSettings que contiene la coleccin de cadenas de caracteres que representan todos los valores de los parmetros personalizados definidos en la seccin . Se trata de una coleccin basada en claves, donde el valor de cada clave es el nombre del parmetro. As pues, utilizando el nombre del parmetro en el indizador podramos recuperar su valor. La siguiente instruccin nos permitira recuperar el valor del parmetro url definido en el ejemplo anterior: string dir = ConfigurationManager.AppSettings["url"];

Cadena de conexin en Web.config Adems de la seccin que nos permite aadir parmetros personalizados de uso general, tenemos un elemento llamado , especfico para registrar cadenas de conexin con bases de datos. Al igual que , el elemento estar incluido directamente en y permitir registrar una cadena de conexin diferente para cada uno de los proveedores de datos con los que puede trabajar la aplicacin. As pues, cada cadena de conexin debe ser registrada en el interior de a travs de un elemento ,Captulo 2. Programacin en Web Forms Pgina 27

el cual deber especificar los datos de los parmetros de conexin mediante los siguientes atributos:

Name: Nombre del parmetro. ProviderName: Espacio de nombres del proveedor al que corresponde la cadena de conexin. ConnectionString: Cadena de conexin. Por ejemplo, si quisiramos incluir la cadena de conexin con la base de datos Libreria, deberamos incluir lo siguiente en el archivo de configuracin Web.config: Obsrvese la utilizacin del elemento para eliminar cualquier referencia a posibles cadenas de conexin existentes. Para recuperar el valor de la cadena de conexin desde cdigo utilizaremos la propiedad ConnectionStrings de la clase ConfigurationManager. Esta propiedad contiene la coleccin de objetos ConnectionStringSettings, que representan a cada uno de los elementos definidos en . Utilizando el indizador con el nombre del parmetro podremos acceder a cada uno de estos objetos: ConnectionStringSettings cadEmpresa; cadEmpresa = ConfigurationManager.ConnectionStrings["ConEmpresa"]; La clase ConnectionStringSettings contiene una serie de propiedades que nos permiten acceder al resto de los atributos del elemento , como, por ejemplo, ProviderName y ConnectionString, que contienen el espacio de nombres del proveedor y la cadena de conexin, respectivamente. As pues, para recuperar en el cdigo la cadena de conexin con la base de datos librera escribiramos: string cadenaCon = cadEmpresa.ConnectionString;Captulo 2. Programacin en Web Forms Pgina 28

2.4. Objetos Avanzados ASPDentro de los controles avanzados en ASP, vamos a ver los controles de validacin que permiten a los programadores ahorrar una gran cantidad de tiempo y lneas de cdigo en el desarrollo de una aplicacin Web, ya que una de las tareas ms pesadas y rutinarias que existen; como es la validacin de los datos de usuario antes de su procesamiento, puede ser realizada mediante este tipo de controles sin incluir una sola lnea de cdigo. Dado que esta clase de validacin se realiza normalmente en el cliente antes de que los datos sean enviados al servidor, los controles de validacin incluyen en las pginas los scripts necesarios para realizar las diferentes comprobaciones de los datos, evitando que se produzca la recarga de la pgina si se incumple alguno de los criterios de validacin. La ejecucin de estos scripts de cliente tiene lugar de forma automtica cuando se intenta realizar la recarga de la pgina, por ejemplo, al producirse el evento Click en un botn de pulsacin o en un LinkButton. Si se desea realizar la validacin en servidor en vez de en cliente, estos controles pueden ser configurados tambin para ello. ASP.NET proporciona un buen nmero de controles de validacin, cada uno especializado en la comprobacin de un determinado criterio. No obstante, todos ellos comparten una serie de propiedades comunes. Ejemplo: Uso ControlesValidacion Todos los controles de validacin heredan de la clase BaseValidator. Esta proporciona una serie de propiedades que son comunes a todo este tipo de controles; entre ellas destacamos: ControlToValidate. Todo control de validacin tiene que estar asociado al control que tiene que validar. Este debe ser especificado en tiempo de diseo en esta propiedad. ErrorMessage. Representa el mensaje de error que debe aparecer cuando se incumple el criterio de validacin asociado al control. Este mensaje puede aparecer en el propio control de validacin, en un cuadro de dilogo o en algn otro lugar de la interfaz grfica, segn se especifique en un objeto llamado ValidationSummary que comentaremos ms adelante. EnabledClientScript. Esta propiedad permite activar/desactivar la utilizacin de scripts de cliente para la validacin. Si su valor es false, la validacin se realizar en el servidor, no en el cliente. IsValid. Se utiliza cuando se realiza la validacin en el servidor para conocer si el control asociado cumple (true) o no (false) losCaptulo 2. Programacin en Web Forms Pgina 29

criterios de validacin. La clase Page tambin dispone de esta propiedad y su valor ser true cuando todos los controles de validacin tengan su propiedad IsValid a true, mientras que ser Tipos de controles de validacin Los controles de validacin se encuentran en el cuadro de herramientas de Visual Studio.NET dentro de la pestaa Validacin. La inclusin de estos controles en el formulario se realiza igual que en el caso de los controles estndares. Normalmente, suelen colocarse al lado del control que tienen que validar. A continuacin analizaremos los seis controles de validacin existentes. 2.4.1. Control RequieredFieldValidator Se utiliza para forzar la introduccin de un valor en un determinado control de la interfaz de usuario, convirtiendo as al control en un campo requerido. Configurando las propiedades comentadas anteriormente sera suficiente para que el control realizara su funcin. No obstante, hay casos en los que no basta con comprobar que un determinado campo de texto haya sido rellenado, sino que es necesario que su contenido sea diferente a un valor dado. Para esta situacin, el control RequiredFieldValidator dispone de la propiedad InitialValue, de modo que si el contenido del campo a validar tiene un valor distinto al indicado en esta propiedad, el control habr incumplido el criterio de validacin. 2.4.2. Control RangeValidator Permite comprobar que el contenido de un campo se encuentra dentro de un rango de valores establecido; de no ser as el control asociado incumplir los criterios de validacin y no se producir el envo de los datos al servidor. Adems de las comunes al resto de los controles de validacin, RangeValidator dispone de las siguientes propiedades especficas: MaximumValue. Valor mximo que puede alcanzar el control para que se considere vlido. MinimumValue. Valor mnimo que puede alcanzar el control para que se considere vlido. Type. Tipo de datos de los valores que se van a comparar. Como podemos ver en la ventana de propiedades, estos valores pueden ser Integer, String, Double, Date y Currency.

Captulo 2. Programacin en Web Forms

Pgina 30

2.4.3. Control CompareValidator Mediante este control forzamos a que el contenido de un determinado campo sea igual al de otro campo existente o a otro valor dado. CompareValidator se emplea, por ejemplo, en las clsicas pginas de registro donde el usuario tiene que introducir dos veces su contrasea para comprobar que el campo donde se introduce el segundo valor coincide con el primero. Entre las propiedades especficas de este control tenemos: ControlToCompare. Control con cuyo valor debe ser comparado el del control a validar. Operador. Operador de comparacin utilizado. Esta propiedad permite que la comparacin se pueda basar no slo en la igualdad, sino tambin en otros criterios, incluso en la igualdad de tipos (DataTypeCheck). Type. Tipo de datos de los valores comparados. ValueToCompare. Valor con el que se quiere comparar el control. Se configura esta propiedad, en vez de ControlToCompare, cuando el campo tiene que ser comparado con un valor dado y no con otro campo. 2.4.4. Control RegularExpressionValidator Con este control podemos obligar a que el contenido de un campo se ajuste a una determinada mscara o formato, como, por ejemplo, un nmero de telfono, un distrito postal o una direccin de correo electrnico. La propiedad especfica ms importante de RegularExpressionValidator es ValidationExpression, en la cual se establece en tiempo de diseo el formato que deben tener los datos introducidos en el control asociado. Como podemos ver a travs de la ventana de propiedades de Visual Studio.NET, existe una gran variedad de formatos aplicables a esta propiedad. 2.4.5. Control CustomValidator En la mayora de los casos, con los controles anteriores podemos cubrir la gran mayora de los requerimientos de validacin que se pueden presentar. No obstante, ASP.NET proporciona el control CustomValidator, con el que podemos establecer nuestros propios criterios de validacin personalizados para aquellos casos en donde los dems controles de validacin no cubran los requerimientos necesitados. La propiedad especfica ms importante de este control es ClientValidationFunction. En ella se debe indicar el nombre de la funcin de JavaScript que debe ser ejecutada para validar el control asociado. Esta

Captulo 2. Programacin en Web Forms

Pgina 31

funcin deber estar definida en la vista HTML de la pgina y tendr el siguiente formato: function Nombre_Funcion(source, args) { //cdigo de validacin } Source representa el objeto HTML (control) que se tiene que validar y args es un objeto que permite controlar el estado de la validacin. El objeto args proporciona dos propiedades importantes: Value. Valor que se debe validar. Representa el contenido del argumento Value del control HTML correspondiente. IsValid. Se utiliza para establecer el resultado de la validacin, asignndole true cuando el control a evaluar cumpla los criterios de validacin y false cuando no los cumpla. El valor que se asigne a esta propiedad ser almacenado en la propiedad IsValid del control de validacin al finalizar la ejecucin de la funcin. Por ejemplo, la siguiente funcin de JavaScript permitira establecer un criterio de validacin mediante el cual el contenido del control se considerara vlido si el nmero de caracteres contenidos en el mismo fuera mayor de cuatro: function comprobar (source, args) { //si la propiedad ControlToValidate apunta a un control Web //de tipo TextBox, la propiedad Value del argumento args //contendr el texto introducido en ese control if(args.Value.length>4) args.IsValid=true; else args.IsValid=false; }

2.4.6. Control ValidationSummary El control ValidationSummary no es un control de validacin propiamente dicho. Su misin es definir la forma en la que se van a mostrar los mensajes de error de los controles de validacin existentes en la pgina. Este control dispone de las siguientes propiedades: ShowMessageBox. Indica si los mensajes de error sern mostrados o no en un cuadro de dilogo. Si su valor es true, al intentar realizar el submit de la pgina se presentar un cuadro deCaptulo 2. Programacin en Web Forms Pgina 32

dilogo con los mensajes de error correspondientes a los controles de validacin, cuyos criterios no hayan sido cumplidos por los controles asociados. ShowSummary. Indica si los mensajes de error se visualizarn o no en el control ValidationSummary. Esta propiedad es compatible con la anterior, pudindose mostrar los mensajes tanto en un cuadro de dilogo como en dicho control. DisplayMode. Permite definir la forma en que sern mostrados los mensajes de error en el control ValidationSummary. Sus valores pueden ser en forma de lista simple, en forma de lista con vietas o como un nico prrafo.

Captulo 2. Programacin en Web Forms

Pgina 33

(Final Documento)

Captulo 2. Programacin en Web Forms

Pgina 34