Sei sulla pagina 1di 219

Introduccin Bienvenid@ al tutorial de inicio rpido de ASP.NET 2.0 El tutorial de inicio rpido de ASP.

NET consiste en una serie de ejemplos y comentarios de soporte diseados para poner a los desarrolladores rpidamente al tanto de la sintaxis, arquitectura, y poder del framework de programacin Web de ASP.NET. Los ejemplos de inicio rpido estn diseados para ser breves, e ilustraciones fciles de entender de las caractersticas de ASP.NET. Cundo acabis de leer este tutorial, estaris familiarizados con el amplio rango de nuevas caractersticas de ASP.NET, as como de las caractersticas que ya existan en versiones anteriores.

Notas de la publicacin:Esta versin del tutorial de inicio rpido simplemente presenta una visin general de las emocionantes nuevas caractersticas del nuevo Framework de ASP.NET. A medida que vaya habiendo nuevo contenido y ejemplos para esta publicacin, estarn disponibles es el website de ASP.NET. Visitar dicho website es la mejor forma de aprender ms despus de leer este tutorial, as que visitadlo en bsqueda de actualizaciones. Qu nivel de habilidad se supone en este tutorial? Este manual asume que estis familiarizados con los temas bsicos de la programacin web, como por ejemplo HTML y organizacin de websites. No necesitis experiencia previa en ASP, pero deberais estar familiarizados con los conceptos que hay detrs de las pginas web interactivas, incluyendo formularios, scripts y acceso a datos. Esperamos que disfrutes de esta nueva publicacin tanto como nosotros hemos disfrutado redactndola (y traducindola).

-- The Microsoft Web Platform and Tools Team Introduccin a Visual Web Developer 2005 Express Edition Visual Web Developer 2005 Express Edition es parte de la familia Microsoft Visual Studio 2005, y es la mejor herramienta de desarrollo para hacer aplicaciones web

con ASP.NET 2.0. Como parte de la familia Express, Visual Web Developer se puede actualizar a Visual Studio Standard, Professional, y Team System, sin problemas. Visual Web Developer est orientado a las necesidades especficas del desarrollador web a travs de un nuevo perfil web que muestra un men y un diseo de ventana optimizado para el desarrollo web. El entorno incluye el mejor editor de cdigo HTML, una herramienta mejorada para el diseo visual de las pginas, un nuevo sistema de proyectos, mejor soporte para el trabajo con datos, y soporte completo para los standards XHTML. Todas estas caractersticas permiten desarrollar aplicaciones Web orientadas a datos ms rpida y fcilmente que nunca antes. A continuacin veremos algunas de las muchas mejoras que introduce Visual Web Developer en el desarrollo Web. Mejor Edicin de Cdigo Fuente. Visual Web Developer tiene un editor de cfigo fuente HTML mejorado que nos permite escribir y modificar las pginas ms rpidamente. Dicho editor proporciona Intellisense completa durante todo el fichero y tiene nuevas funciones para navegar y validar los marcadores.

Intellisense en todas partes Intellisense (el popup que aparece mientras vamos escribiendo) tiene un gran impacto en la productividad como desarrollador. A pesar que el soporte para Intellisense en Visual Studio .NET 2003 es excelente, en Visual Web Developer se ha mejorado. En Visual Web Developer, Intellisense se abre en cualquier lugar. Por ejemplo, se puede aprovechar completamente Intellisense en los bloques de un script, en un solo fichero ASP.NET. Adems, Visual Web Developer tambin soporta Intellisense para Directivas ASP.NET y para atributos de estilos CSS en un misma pgina.

Visual Web Developer tambin proporciona Intellisense para tods las secciones en un mismo fichero de configuracin Web.Config, as como en cualquier fichero genrico XML que contiene un DTD o una referencia de Esquema XML.

Utilizando Intellisense Conservacin de cdigo HTML Visual Web Developer respeta vuestro HTML. Se respetar el formato de vuestro marco HTML (incluyendo todos los espacios blancos, indentacin, retornos de carro, maysculas) exactamente igual a como fue escrito, incluso cuando se cambie de la vista de diseo a la vista de cdigo, o viceversa. Podis confiar completamente en que Visual Web Developer no modificar nunca la etiqueta/marca. Opciones de Formateo HTML Visual Web Developer nos permite controlar de forma precisa el formato de todas las etiquetas HTML o de Control de Servidor de ASP.NET generadas mediante el editor WYSIWYG. Ahora podemos configurar la conversin de etiquetas, el citado de atributos, el estilo de indentacin y las caractersticas de Word wrap de cada html o etiqueta de control del servidor de una pgina. Se puede fijar dichas caractersticas de formateo como las predefinidas para todas las etiquetas, as como, opcionalmente, sobrescribir cada opcin de formateo por una base por

etiqueta/control. Esto nos proporciona la flexibilidad de controlar de forma completa como queremos que se generen nuestras etiquetas. Los ajustes de formato HTML se pueden exportar e importar desde Visual Web Developer para permitir la estandarizacin de estilos de los diferentes desarrolladores de un mismo equipo. Visual Web Developer tambin permite a los desarrolladores aplicar fcilmente las reglas de formateo HTML a un cdigo de etiquetado ya existente (para manejar los casos en los que necesitamos actualizar cdigo HTML ya existente con nuevas reglas de formateo). Navegador de Etiquetas El editor de cdigo HTML incluido en Visual Web Developer contiene una funcin nueva de Navegador de Etiquetas, qu permite a los desarrolladores conocer fcilmente su posicin y navegar por cualquier documento HTML. El Navegador de Etiquetas muestra la ruta actual en el cdigo fuente de una pgina HTML, mostrndonos una lista de todas las etiquetas HTML que contienen la etiqueta dnde el cursos est situado actualmente. Haciendo clic en cualquiera de los nodos los desarrolladores podrn cambiar el nivel del cdigo seleccionado, y moverse rpidamente por toda la jerarqua. Imaginemos, por ejemplo, que estamos editando el cdigo de una pgina HTML con mltiples tablas HTML anidadas. Editar tablas anidadas puede ser difcil ya que es muy fcil perderse en la jungla de filas y columnas anidadas. Sin embargo, utilizando el Navegador de Etiquetas se puede evitar perderse ya que no muestra de forma continua el path actual en la jerarqua de la tabla de elementos. Tag Outlining Tag Outlining nos permite trabajar de forma ms eficiente en grandes documentos HTML. Con Tag Outlining podemos hacer clic con el botn derecho sobre cualquier etiqueta de un documento HTML en el editor de cdigo y seleccionar Colapsar Etiqueta para esconder todo el cdigo que contiene dicha etiqueta.

Esconder diferentes regiones del cdigo HTML contenido en una pgina nos permite centrarnos en la regin particular de dicha pgina que queremos editar. Adaptacin y Validacin Flexibles del Navegador "Destino" Visual Web Developer nos permite de forma sencilla marcar como objetivo un Standard HTML especfico o un determinado navegador web cuando escribimos nuestras pginas. Por ejemplo, podemos hacer que nuestras pginas estn optimizadas para un navegador particular, como Nestcape Navigator 4.0 o Internet Explorer 6.0. Adicionalmente podemos querer que nuestro cdigo siga un Standard HTML particular, como XHTML 1.0 Estricto o XHTML 1.0 Transitional. Una vez hecho esto, el HTML que escribamos se ir validando en tiempo real en el editor. El cdigo invlido se subrayar automticamente en rojo (con una etiqueta dnde nos mostrar la explicacin de por qu hemos violado el objetivo). Los errores encontrados se van incluyendo en tiempo real en la ventada de Lista de Tareas. <!--[if !vml]-->Todas las normas de validacin de navegadores/Standard se pueden aadir al Visual Web Developer, y se pueden extender y personalizar fcilmente. Visual Web Developer incluye varios objetivos de validacin automticos entre los que estn XHTML, XHTML Transicional, y la mayora de navegadores para ordenadores y para dispositivos mviles.

Seleccionando un objetivo de validacin

Mejor Soporte a Datos

Visual Web Developer hace que el trabajo con datos en las aplicaciones web sea mas sencillo. Arrastrar y Dejar Caer (Drag and Drop) Acceso a Datos Podemos crear fcilmente una pgina web con acceso a base de datos arrastrando y dejando caer los controles en la pgina. Aprovechando los nuevos

controles de origen de datos de ASP.NET 2.0, podemos conectarnos de forma fcil a la base de datos, obtener registros, y actualizarlos sin escribir nada de cdigo (o que lo haga Visual Studio por nosotros). Imaginemos, por ejemplo, que queremos mostrar en una pgina web todos los registros que se llamen Productos de una tabla de la base de datos que hay en un servidor Microsoft SQL Server. Para ello, simplemente tendremos que arrastrar dos controles a la pgina: un control SqlDataSource y un control GrisView. Configurando algunas de las propiedades de dichos controles, podremos recuperar y mostrar automticamente los registros en la pgina web. Diseador de la Capa de Acceso a Datos Visual Web Developer proporciona soporte para el diseador que incorpora, para la creacin y mantenimiento de la Capa de Acceso de Datos (Data Access Layer) dentro de nuestra aplicacin web. El diseador de datos (data designer) permite a los desarrolladores modelar las tablas de la base de datos y los procedimientos almacenados como componentes que encapsulan lgica de acceso a datos ADO.NET. Potente Enlazado a Objetos de Datos Visual Web Developer nos permite crear rpidamente aplicaciones de 3 niveles con capas de presentacin, negocio y datos diferenciadas. Aprovechando el nuevo control ObjectDataSource de ASP.NET, podremos mapear controles de datos (como GridView, DataList o DropDownList) a componentes de negocio o datos, en lugar de mapear los controles directamente a la base de datos. Esto permite la encapsulacin y abstraccin de la funcionalidad de nuestra aplicacin y elimina la necesidad de escribir ningn cdigo de acceso a datos el la capa de presentacin. El entorno de desarrollo nos gua automticamente a travs del proceso de mapeo de controles de datos en objetos de negocio. Se solicitar a los desarrolladores que seleccionen el mtodo particular del objeto de negocio para seleccionar,

insertar, actualizar y borrar datos. No se requerir ningn cdigo desde el desarrollador de pginas (page Developer). Administracin de Cadenas de Conexin Visual Web Developer nos ayuda a evitar tener que usar conexiones a bases de datos mediante hard-coding" en nuestras pginas ASP.NET. Todsa los dilogos y asistentes para conexiones de datos nos proporcionan la opcin de almacenar las cadenas de conexin a base de datos en el fichero Web.Config de la aplicacin. El hecho de almacenar los strings de conexin a base de datos en el fichero Web.Config hace que los strings de conexin sean ms manejables y seguros. Si necesitamos cambiar el password de nuestra base de datos, slo tendremos que hacerlo en un sitio. La herramienta de administracin de ASP.NET 2.0 MMC proporciona una interfaz sencilla de utilizar, con la que podremos cambiar los strings de conexin en los servidores. Adems, la herramienta se puede utilizar para encriptar los strings de conexin en los servidores de produccin. Mejor Soporte de Standards

Visual Web Developer nos permite crear fcilmente aplicaciones que respeten los estndares de la industria y el gobierno. El entorno de desarrollo incluye nuevas herramientas para el soporte de estndares W3C, como XHTML, y estndares de gobierno, como los de accesibilidad. Diseador que cumple con XHTML Todo el cdigo HTML generado con el Visual Web Developer est en conformidad con XHTML. Por ejemplo, todas las opciones de formateo disponibles desde la barra de herramientas generan HTML completamente conforme a XHTML. Todas las etiquetas generadas en el diseador estn bien formadas y adecuadamente escrita para XHTML.

Adems del soporte de diseo XHTML, Visual Web Developer tambin incluye herramientas para ayudarnos a escribir cdigo acorde con XHTML en el editor de cdigo. Mientras trabajamos en el editor de cdigo, podemos validar nuestro cdigo HTML con los estndares XHTML 1.0 Transitional o XHTML 1.0 Strict. Cuando el cdigo no se valida de forma satisfactoria, se nos proporciona una explicacin del por qu del fallo. Comprobador de Accesibilidad La creacin de pginas Web accesibles (pginas web que pueden ser utilizadas por personas con discapacidades) es un requerimiento para muchas agencias gubernamentales y grandes empresas. Visual Web Developer nos permite de forma muy sencilla validar y hacer cumplir los estndares de accesibilidad. Podemos utilizar la herramienta Visual Web Developer Accessibility Checker (disponible en Visual Studio Standard Edition y superiores) para identificar de forma rpida problemas de accesibilidad de nuestra aplicacin. El Accessibility Checker valida nuestras pginas web contra los estndares de la Section 508 y W3C Web Content Accessibility Guidelines (WCAG), y nos informar de alertas y errores en la Lista de Tareas IDE. Resumen

Visual Web Developer es la mejor herramienta para crear aplicaciones web orientadas a datos y dinmicas con ASP.NET 2.0. Como se ha explicado y demostrado en los Quickstarts, proporciona grandes mejoras para el desarrollador de aplicaciones web. Con Visual Web Developer y las mejoras de ASP.NET seremos capaces de crear aplicaciones web ricas en funciones y orientadas a base de datos, de forma ms rpda y sencilla que nunca antes Dnde aprender ms

Si ests interesado en aprender ms sobre ASP.NET 2.0, chale un vistazo a las siguientes fuentes:

Web

oficial

de

ASP.NET

La web oficial de ASP.NET contiene informacin actualizada, artculos, tutorials, ejemplos y prcticamente todo sobre ASP.NET.

Foros

ASP.NET

Uno de los mejores modos para aprender, preguntar dudas y tambin resolverlas en mediante los foros de ASP.NET. Hay foros dedicados a diferentes campos, entre ellos estn los dedicados al Visual Web Developer y a ASP.NET 2.0. Hay gente muy cualificada respondiendo, incluso el propio equipo de ASP.NET participa regularmente en ellos! Eso s, est todo en ingls. Para foros en castellano, no dudes en visitar nuestro foro de ASP.NET.

ASP.NET ASP.NET.

Developer

Center

El centro de desarrollo de ASP.NET es el recurso clave de MSDN para

Documentacin

del

.NET

Framework

El .NET Framework 2.0 viene con mucha documentacin sobre las nuevas caractersticas de ASP.NET 2.0. Se trata de una muy buena referencia para saber de primera mano todo lo que ASP.NET 2.0 puede ofrecerte. Vista Previa de ASP.NET 2.0 Construyendo una aplicacin web Lo nuevo en 2.0

Clases Compiladas Dinmicamente - Adems de colocar las clases precompiladas en el directorio Byn, ASP.NET 2.0 nos permite colocar ficheros fuente de clases compartidas en el directorio App_Code, donde sern compilados dinmicamente como pginas ASPX.

Cdigo Simplificado detrs de las Pginas - Los ficheros "code-behind" de ASP.NET 2.0 utilizan una nueva caracterstica llamada clases parciales, que permitesn que dichos ficheros de "code-behind" sean compilados dinmicamente con sus pginasa ASPX asociadas en un slo tipo de clase. Esto significa que no necesitaremos declarar variables miembro para cada control en la pgina de code-behind, lo cual simplifica en gran manera el mantenimiento de sitios que usan esta tcnica de separacin de cdigo

Varios Controles de Servidor Nuevos - ASP.NET 2.0 incluye unos 50 nuevos controles, lo cual hace que crear elemntos comunes de UI en nuestras pginas web sea ms fcil que nunca. Por ejemplo, los controles de Datos simplifican los escenarios de acceso a datos, los de Login aaden seguridad al site, los de Navegacin permiten la navegacin por el site, y los de WebPart permiten crear fcilmente pginas web personalizadas.

Nueva Sintaxis de Expresin Declarativa - La sintaxis de expresin declarativa en ASP.NET 2.0 nos permite substituir la configuracin de la aplicacin, las cadenas de conexin, y los recursos de localizacin en nuestras pginas antes de que sean analizadas y ejecutadas.

En esta seccin hablaremos sobre stas y otras caractersticas de aplicaciones ASP.NET bsicas. Una aplicacin web en ASP.NET es un conjunto de pginas, controles, mdulos de cfigo, y servicios, todos ellos ejecutandose en un solo directorio de aplicacin de un servidor web (normalmente IIS). ASP.NET hace que resulte muy sencillo crear las aplicaciones web dinmicas que podemos encontrar hoy en da por toda la Internet. Nos proporciona un modelo simple de programacin basado en el Framework .NET y varios controles y servicions ya incluidos que permite crear la mayor parte de los escenarios que encontramos el gran parte de las aplicaciones, con poco cdigo y esfuerzo. En esta seccin demostraremos los elementos

bsicos de una aplicacin web que utilizaremos en el resto de la gua de inicio rpido, incluyendo:

El Framework para Pginas ASP.NET (Formularios Web) Controles de Servidor Web y HTML Mdulos o Montajes de Cdigo Compartido

Esta seccin tambin explica unos pocas de las mejoras hechas a los bloques de creacin de aplicaciones en ASP.NET 2.0 frente a versiones previas de ASP.NET.

Introduccin a Pginas ASP.NET El Framework para pginas con formularios Web de ASP.NET es un modelo de programacin de tiempo de ejecucin con un lenguaje escalable y comn, que puede usarse en el servidor para generar dinmicamente pginas Web. Pensado como una evolucin lgica de ASP (ASP.NET proporciona compatibilidad de sintaxis con las pginas existentes), el Framework de pginas ASP.NET ha sido especficamente diseado para solucionar algunas deficiencias claver del modelo previo. De forma particular, proporciona la habilidad de crear y utilizar controles UI reutilizables que pueden encapsular una funcionalidad comn y, por tanto, reducir la cantidad de cdigo que el desarrollador tiene que escribir, la habilidad de los desarrolladores para estructurar de forma clara las pginas en un estilo odenado (no cdigo "spaghetti"), y la habilidad de las herramientas de desarrollo de proporcionar un potente soporte de diseo WISIWIG para las pginas (el cdigo ASP existente en opaco para las herramientas). esta seccin del tutorial proporciona un breve resumen del cdigo de alto nivel de algunas de las caractersticas basicas de las pginas ASP.NET. Las siguientes secciones tratarn ms a fondo detalles Escribiendo nuestra primera pgina ASP.NET La pginas ASP.NET son ficheros de texto con la extensin .aspx. Las pginas consisten en cdigo y marcas y son compiladas y ejecutadas dinmicamente en el servidor para producir una traduccin para el navegador (o dispositivo) cliente. Se pueden desplegar a travs de un rbol de directorios raz de IIS. Cuando un navegador hace una peticin de un recurso .aspx, la rutina ASP.NET analiza y compila el fichero a una clase del Framework .NET. Esta clase puese ser utilizada

para procesar dinmicamente peticiones entrantes. (NOTA: el fichero .aspx se compila nicamente la primera vez que es accedido; la instancia compilada se reutiliza en las sucesivas peticiones).

Una pgina ASP.NET puede ser creada simplemente cambindole la extensin de un fichero HTML por la extensin .aspx (no hace falta modificar el cdigo). Por ejemplo, el siguiente ejemplo nos demuestra una sencilla pgina HTML que recoge un nombre de usuario y una preferencia de categora y lugo realiza un postbak del formulario a la pgina que lo origina cuando se hace clic sobre el botn:

C#

Intro1.aspx

Importante: Notad que no pasa nada cuando se hace clic en el botn Lookup. Esto es debido a que la pgina .aspx slo contiene HTML estatico (no tiene contenido dinmico). Por lo tanto, el mismo HTML es enviado de vuelta al cliente en cada viaje de la pgina, lo que resulta en una prdida de los contenidos de los campos del formulario (el "textbox" y el "drop-down list") entre peticiones.

Aadiendo Cdigo Simple a una Pgina ASP.NET proporciona compatibilidad de sintaxis con pginas ASP ya existentes. Esto incluye el soporte para los bloques de renderizado de cdigo del tipo <% %> que se pueden metern entre el contenido HTML en un fichero .aspx. Estos bloques se ejecutan de forma descendente en el momento del "renderizado".

El siguiente ejemplo demuestra como los bloques de renderizamiento <% %> se pueden utilizar para hacer un bucle sobre un bloque de cdigo HTML (incrementando el tamao de la fuente en cada pasada): C# Intro2.aspx

Importante: a diferencia de ASP, el cdigo utilizado en los bloques <% %> de arriba es en realidad compilado (no interpretado utilizando un motor de script). Esto conlleva una mejora en el rendimiento en tiempo de ejecucin.

Los desarrolladores de pginas ASP.NET pueden utilizar los bloques <% %> de cdigo para modificar dinmicamente la salida HTML tanto como pueden hacerlo actualmento con ASP. Por ejemplo, el siguiente ejemplo demuestra como los bloques <% %> de cdigo pueden usarse para interpretar los resultados que nos enva un cliente.

C#

Intro3.aspx

Importante: a pesar que los cdigos <% %> de cdigo proporcionan una forma potente de manipular a medida la salida de texto devuelto por una pgina ASP.NET, no nos proporcionan un modelo "limpio" de programacin HTML. Como nos ilustra el ejemplo de arriba, los desarrolladores que slo usen bloques <% %>

tienen que administrar el estado de las pginas en cada iteracin del bucle e interpretar los valores que se envan.

Introduccin a los Controles de Servidor de ASP.NET Adems de cdigo y marcas, las pginas ASP.NET pueden contener controles de servidor, que son objetos programables del lado del servidor que tpicamente representan un elemento UI en la pgina, como un textbox o una imagen. Los controles de servidor participar en la ejecucin de la pgina y producen sus propias etiquetas para el navegador cliente. La principal ventaja de los controles de servidor es que permiten a los desarrolladores obtener un comportamiento y un renderizado complejo a partir de componentes sencillos, reduciendo as dramticamente la cantidad de cdigo necesaria para crear una pgina Web dinmica. Otra ventaja de los controles de servidor es su facilidad para personalizar su comportamiento o renderizado. Los controles de servidor muestran propiedades que pueden ajustarse bien de forma declarativa (en la etiqueta) o bien de forma programada (con cdigo). Los controles de servidor (y la pgina en si) tambin tienen eventos que los desarrolladores pueden controlar para realizar acciones especficas durante la ejecucin de la pgina, o en respuesta a una accin del lado del cliente que enve la pgina al servidor (un "postback"). Los controles de servidor tambin simplifican el problema de mantener el estado durante diferentes idas y venidas del servidor, manteniendo sus valores de forma automtica en sucesivos postbacks.

Los controles de servidor se declaran en un fichero .aspx mediante etiquetas propias o etiquetas HTML intrnsecas que contienen el atributo runat="server". Las etiquetas HTML intrnsecas son manejadas con uno de los controles del "namespace" corresponda System.Web.UI.HtmlControls. a uno de los A cualquier se le etiqueta asigna que el no tipo controles

System.Web.UI.HtmlControls.HtmlGenericControl.

El siguiente ejemplo utiliza cuatro controles de servidor: <form runat=server>, <asp:textbox runat=server>, <asp:dropdownlist runat=server>, y <asp:button runat=server>. En tiempo de ejecucin estos controles de servidor generan de forma automtica el contenido HTML.

C#

Intro4.aspx

Importante: Observar que los controles de servidor mantienen de forma automtica entre viajes al servidor cuanquier valor insertado en el lado del cliente. Este estado del control no se almacena en el servidor (en lugar de eso se almacena en un campo <input type="hidden" de formulario que se enva y devuelve en las diferentes peticiones). Obsevar adems que no es necesario ningn script del lado del cliente.

Adems de soportar controles estdares de entrada HTML, ASP.NET permite a los desarrolladores utilizar controles personalizados ms ricos en sus pginas. Por ejemplo, el siguiente ejemplo demuestra como el control <asp:adrotator> se puede utilizar para mostrar dinmicamente "ads" cambiantes en la pgina.

C#

Intro5.aspx

Importante: Un listado detallado de todos los controles de sevidor incluidos se puede encontrar en la seccin de Referencia de Controles de este tutorial. Manejando Eventos de Controles de Servidor Cada control de Servidor de ASP.NET es capaz de mostrar un modelo de objeto conteniendo propiedades, mtodos y eventos. Los desarrolladores de ASP.NET utilizan este modelo de objeto para modificar de forma limpia e interactuar con la pgina. El siguiente ejemplo nos demuestra como un desarrollador de pginas ASP.NET puede controlar el eventoOnClick del control <asp:button runat=server> control para manipular la propiedad Text del control <asp:label runat=server>. C# Intro6.aspx

Este ejemplo simple es equivalente en funcionalidad al ejemplo "Intro3" mostrado anteriormente en esta seccin. Sin embargo, cabe observar la mayor limpieza y simplicidad del cdigo en la versin basada en controles de servidor. As como veremos posteriormente en el tutorial, el Framework de pginas ASP.NET tambin muestra gran variedad de eventos a nivel de pgina, que podemos controlar para escribir cdigo que se ejecute en un momento determinado durante el procesado de la pgina. Ejemplos de estos eventos son Page_Load y Page_Render. Trabajando con Controles de Servidor Los controles de servidor ASP.NET se identifican en una pgina usando las etiquetas declarativas que contienen el atributo runat="server". El siguiente ejemplo declara tres controles de servidor <asp:label runat="server"> y personaliza las propiedades de texto y estilo de cada uno individualmente.

C#

Controls1.aspx

Manipulando Controles de Servidor Podemos identificar de forma individual a un control de servidor de ASP.NET en nuestra programacin, proporcionndole a dicho control un atributo id. Podemos usar esta referencia id para manipular, programando, en tiempo de ejecucin el modelo de objeto del control de servidor. Por ejemplo, el siguiente ejemplo nos muestra como un desarrollador de pginas podra establecer, programndolo, la propiedad Text de un control <asp:label runat="server"> en el evento Page_Load.

C#

Controls2.aspx

Manejando Eventos de Control Los controles de servidor de ASP.NET pueden, opcionalmente, mostrar y provocar eventos de servidor, qu pueden ser manejados por los desarrolladores de pginas. Un desarrollador debe cumplir sto conectando de forma declarativa un evento a un control (dnde el atributo "name" del evento indica el nombre del evento, y el atributo "value" indica el nombre del mtodo a llamar. Por ejemplo, el siguiente cdigo muestra como asociar un evento OnClick a un control del tipo button.

C#

Controls3.aspx

Manejando Mltiples Eventos de Control Los manejadores de eventos proporcionan a los desarrolladores una forma limpia de estructurar la lgica en una pgina ASP.NET. Por ejemplo, el siguiente ejemplo nos demuestra como conectar y manejar cuatro eventos de botn en una sola pgina.

C#

Controls4.aspx

Llevando a Cabo Navegacin entre Pginas (Escenario 1) La navegacin entre varias pginas es un escenario comn en casi todas las aplicaciones Web. El siguiente ejemplo muestra como usar el control <asp:hyperlink runat=server> para navegar a otra pgina (pasando parmetros personalizados de query string). Este ejemplo tambin demuestra como obtener acceso a dichos parmetros desde la pgina objetivo, de forma sencilla. C# Controls5.aspx

Llevando a Cabo Navegacin entre Pginas (Escenario 2) No todos los escenarios se inician a travs de hipervnculos en el cliente. Las redirecciones y "navegaciones" en la parte del cliente tambin se pueden iniciar desde el servidor llamando al mtodo Response.Redirect(url). Esto se hace normalmente cuando es necesaria una validacin del lado del servidor en alguna de las entradas del cliente, antes que se realice la navegacin.

El siguiente ejemplo demuestra como usar el mtodo Response.Redirect para

pasar parmetros a otra pgina destino. Tambin nos demuestra como conseguir acceso a estos parmetros de forma sencilla desde la pgina destino. C# Controls6.aspx

Pginas Inline Code vs. Pginas Code-Behind ASP.NET proporciona dos formas para organizar el cdigo en nuestras pginas. Separacin de Cdigo "Inline" El siguiente ejemplo demuestra una simple pgina ASP.NET con tres controles de servidor, un TextBox, un Button, y un Label. Inicialmente, estos controles simplemente renderizan sus formularios HTML equivalentes. Sin embargo, cuando se escribe un valor en el TextBox y se hace clic en el Button, en el navegador cliente, la pgina enva la informacin al servidor y maneja el evento del clic en el propio cdigo de la pgina, actualizando dinmicamente la propiedad Text del control Label. Despus, la pgina se recarga para reflejar el texto actualizado. Este ejemplo simple demuestra los mecanismos bsicos que hay detrs del modelo de controles de servidor, que ha hecho que ASP.NET sea uno de los modelos de programacin Web ms sencillos de aprender y dominar.

C#

Inline

Code

Separation

Hay que observar que en el ejemplo anterior, el manejador de eventos para el Button se ha colocado entre las etiquetas <script></script> en la misma pgina que contiene los controles de servidor. En ASP.NET, este tipo de programacin se llama code-inline, y e muy til cuando queremos mantener nuestro cdigo y nuestra lgica de presentacin en un solo fichero. Sin embargo, ASP.NET tambin soporta otra forma de factorizar el cdigo y el contenido de presentacin, llamada

modelo code-behind. Cuando usamos code-behind, el cdigo que maneja los eventos se situa en un fichero que est separado fsicamente de la pgina que contiene los controles de servidor y las marcas. Esta clara diferenciacin entre cdigo y contenido es til cuando necesitamos mantener stos separados, como cuando ms de una persona est involucrada en la creacin de la aplicacin. Es muy comn en proyectos de grupos tener diseadores trabajando en la parte de la UI, mientras que los desarrolladores trabajan en el comportamiento o en el cdigo. EL modelo code-behind es ideal para este ambiente. Modelo Code Behind Simplificado Nuevo en 2.0 ASP.NET 2.0 introduce una rutina mejorada para pginas code-behind que simplifica las conexiones entre la pgina y el cdigo. En este nuevo modelo codebehind, la clase se declara como una clase parcial, lo que permite tanto al fichero de la pgina como al del cdigo ser compilador en una misma clase en tiempo de ejecucin. La pgina del cdigo hace referencia al fichero de code-behind en el atributo CodeFile de la directiva <%@ Page %>, especificando en nombre de la clase en el atributo Inherits. Hay que observar que los miembros de una clase code-behind deben ser o bien "public" o "protected" (no pueden ser privados).

C#

CodeBehind

Code

Separation

La ventaja del modelo simplificado code-behind frente a versiones previas es que no necesitamos mantener declaraciones separadas de variables de controles de servidor en la clase code-behind. La utilizacin de clases parciales (nuevo en 2.0) permite que los IDs de los controles de servidor de la pgina ASPX sean accedidos directamente en el fichero de code-behind. Esto simplifica en gran medida el mantenimiento de las pginas de code-behind. Compartir Cdigo entre pginas

A pesar de que podemos colocar cdigo dentro de cada pgina de nuestro site (utilizando el modelo inline o el modelo code-behind que hemos descrito en el captulo previo), hay veces que lo que querremos ser compartir cdigo entre varias pginas de nuestro site. Sera ineficiente y difcil mantener dicho cdigo copindolo en cada pgina que lo necesite. Afortunadamente, ASP.NET proporciona varias formas cmodas para hacer que el cdigo sea accesible a todas las pginas en una aplicacin. El Directorio "Code" Nuevo en 2.0 Como las pginas se pueden compilar dinmicamente en tiempo de ejecucin, pueden codificar ficheros de forma arbitraria (por ejemplo .cs o .vb). ASP.NET 2.0 introduce el directorio App_Code, que contiene ficheros sueltos con el cdigo que compartiran las diferentes pginasl de nuestra aplicacin. A diferencia de ASP.NET 1.x, dnde ser requera que estos ficheros fueran precompilados en el directorio Bin, cualquier fichero de cdigo del directorio App_Code ser compilado de forma dinmica en tiempo de ejecucin y estar disponible para la aplicacin. Es posible colocar ficheros de ms de un lenguaje en el directorio App_Code, siempre que se particionen en subdirectorios (registrados en un lenguaje particular en el fichero Web.config). El siguiente ejemplo muestra el uso del directorio App_Code para contener una sola clase llamada en la pgina.

C#

Ejemplo

de

la

Carpeta

App_Code

Por defecto, el directorio App_Code slo puede contener ficheros del mismo lenguaje. Sin embargo, podemos particionar dicho directorio en subdirectorios (cada uno conteniendo ficheros de un lenguaje) para contenre mltiples lenguajes bajo el directorio App_Code. Para hacer esto, hay que registrar cada subdirectorio en el fichero Web.config de la aplicacin.

<configuration> <system.web> <compilation> <codeSubDirectories> <add </codeSubDirectories> </compilation> </system.web> </configuration>

directoryName="Subdirectory"/>

El siguiente ejemplo muestra un directorio App_Code particionado para contener ficheros tanto en VB como en C#. C# Ejemplo de Carpeta App_Code Particionada

El Directorio Bin Ya soportado en la versin 1 de ASP.NET, el directorio Bin es como el directorio Code, a excepcin que puede contener ficheros precompilados. Esto es til cuando necesitamos utilizar cdigo que posiblemente haya sido escrito por otra persona, y no tenemos acceso al cdigo fuente (un fichero VB o C#) pero si que tenemos una DLL compilada. Simplemente podemos colocar dicho fichero en el directorio Bin para que sea accesible desde nuestro site. Por defecto, todo lo que hay en el directorio Bin se carga automticamente en la aplicacin y se hace accesible a las pginas. Tendremos que importar espacios de nombres (namespaces) desde los ficheros del directorio Bin utilizando la directiva @Import al principio de la pgina.

<@ Import Namespace="MyCustomNamespace" >

La Cache de "Montaje" (assembly) Global El Framework 2.0 de .NET incluye algunos "ensamblajes" (assemblies) que representan las diferentes partes del Framework. Estos ensamblajes se almacenan en una cache global de ensamblajes, que es un repositorio versionado de ensamblajes puestas a disposicin de todas las aplicaciones de la mquina (no slo de una aplicacin especfica, como era el caso de los directorios Bin o App_Code). Varios ensamblajes del Framework se ponen a disposicin de las aplicaciones ASP.NET de forma automtica. Podemos registrar ensamblajes adicionales en el fichero Web.config de nuestra aplicacin. <configuration> <compilation> <assemblies> <add assembly="System.Data, Culture=neutral, PublicKeyToken=b77a5c561934e089"/> </assemblies> </compilation> </configuration>

Version=1.0.2411.0,

Observar que seguimos necesitando una directiva @Import para que los espacios de nombres de estos ensamblajes estn disponibles para pginas individuales

Referencia de la Sintaxis de Formularios Web Una pgina Web ASP.NET de Formularios es un fichero de texto declarativo con extensin .aspx. Adems del contenido esttico, podemos utilizar ocho elementos distintos de marcado. Esta seccin del tutorial examina cada uno de estos elementos sintcticos y proporciona ejemplos demostrando su uso. Sintaxis de Interpretacin de Cdigo: <% %> y <%= %> Los bloques de renderizacin se denotan con los elementos <% ... %>, y nos permiten controlar de forma personalizada la emisin del contenido y la ejecucin, durante el renderizado en la ejecucin de las pginas Web con formularios. El

siguiente ejemplo nos muestra como podemos usarlos para reallizar iteraciones en el contenido HTML. <% <font <% } %> C# Reference1.aspx for (int i=0; Hello i<8; World! i++) { </font> %> <br>

size="<%=i%>">

En cdigo encerrado entre <% ... %> simplemente se ejecuta, mientras que las expresiones que incluyen el signo igual, <%= ... %>, se evaluan y sus resultados se emiten como contenido. De esta forma, <%="Hello World" %> se interpreta igual que el cdigo C# <% Response.Write("Hello World"); %>.

Nota: Para lenguajes que utilizan marcas para finalizar o separar sentencias (por ejemplo el punto y coma (;) en C#), es importante situar bien estas marcas dependiendo de como tiene que ser interpretado el cdigo. C# code <% Response.Write("Hello World"); %> <%="Hello World"; %> Es necesario el punto y coma.

Mal: Equivaldra "Response.Write("Hello World";);".

<%="Hello World" %>

El punto y coma no es necesario.

Sintaxis de Declaracin de Cdigo: <script runat="server"> Los bloques de declaracin de cdigo definen variables y mtodos miembros, que sern compilados en la clase de Pgina generada. Estos bloques se pueden utilizar para "author" la pgina y la lgica de navegacin. El siguiente ejemplo demuestra como podemos declarar el mtodo Substract en un bloque <script runat="server"> y despues invocarlo desde la pgina. <script int return } </script> <% ... number ... %> C# Reference2.aspx = subtract(number, 1); subtract(int num1 language="C#" num1, int runat=server> num2) { num2;

Importante: A diferencia de ASP -- dnde las funciones se pueden declarar con bloques <% %> -- todas las funciones y variables globales de pgina tienen que declararse en una etiqueta <script runat=server>. Las funciones declaradas con bloques <% %> generarn un error de compilacin. Sintaxis de Controles de Servidor Los controles de servidor ASP.NET personalizados permiten a los desarrolladores generar dinmicamente la interfaz de usuario (UI) HTML y responder a peticiones de los clientes. Se representan en un fichero utilizando una sintaxis declarativa, basada en etiquetas. Estas etiquetas se distinguen de otras etiquetas porque

contienen el atributo "runat=server". El siguiente ejemplo nos demuestra como un control de servidor <asp:label runat="server"> puede ser utilizado en una pgina ASP.NET. Este control corresponde a la clase Label en el espacio de nombres System.Web.UI.WebControls, que se incluye por defecto.

Aadiendo una etiqueta con el ID "Message", se crear cuando se ejecute una instancia de la clase Label: <asp:label id="Message" font-size=24 runat="server"/> El control puede accederse usando el mismo nombre. La siguiente linea establece la propiedad Text del control. Message.Text = "Welcome to ASP.NET"; C# Reference3.aspx

Sintaxis de Control de Servidor de HTML Los controles de servidor HTML permiten a los desarrolladores de pginas manipular de forma programada los elementos HTML de una pgina. Una etiqueta de control de servidor HTML se distingue de los elementos HTML de cliente a travs del atributo "runat=server". El siguiente ejemplo demuestra como un control de servidor HTML <span runat=server> se puede usar en un a pgina ASP.NET. Como con otros controles de servidor, los mtodos y propiedades estn accesibles a traves de la programacin, como se demuestra en el siguiente ejemplo. <script void } </script> Message.InnerHtml language="C#" Page_Load(Object = sender, "Welcome to runat="server"> EventArgs e) { ASP.NET";

... <span id="Message" style="font-size:24" runat="server"/> C# Reference4.aspx

Sintaxis de Enlazado de Datos: <%# %> El soporte de Enlace en ASP.NET permite a los desarrolladores de pginas enlazar las propiedades de control a valores de los contenedores de datos. El cdigo situado entre bloques <%# %> se ejecutar cuando el mtodo DataBind de su contenedor de control "padre" es invocado. El siguiente ejemplo demuestra como utilizar la sintaxis de enlazado de datos en un control <asp:datalist runat=server>. En el datalist, se especifica la plantilla para un elemento. El contenido de la plantilla del elemento se especifica utilizando una expresin de enlazado de datos y el Container.DataItem hace referencia a la fuente de datos utilizada por el datalist MyList. <asp:datalist <ItemTemplate> Here is a value: <%# Container.DataItem %> </ItemTemplate> </asp:datalist> En este caso, la fuente de datos del control MyList se configura programndola y, posteriormente, se llama a DataBind(). void ArrayList items.Add("One"); items.Add("Two"); Page_Load(Object items sender, = EventArgs new e) { id="MyList" runat=server>

ArrayList();

items.Add("Three"); MyList.DataSource MyList.DataBind(); } La llamada al mtodo DataBind de un control provoca un barrido recursivo desde ese control a lo largo del rbol; el evento Databinding se produce en cada control de servidor de la jerarqua y las expresiones de enlazado de datos del control se evaluan consecuentemente. Es decir, si invocamos el mtodo DataBind de una pgina todas las expresiones de enlazado de datos de la pgina sern invocadas. C# Reference5.aspx = items;

ASP.NET 2.0 tambin incluye una nueva sintaxis de databinding simplificada que permite a los controles enlazarse automticamente a los controles de fuente de datos, sin tener que llamar a DataBind() en el cdigo de la pgina. Esta sintaxis se trar en la seccin de Realizando Acceso a Datos. Sintaxis de Etiquetas de Objeto: <object runat="server" /> Las etiquetas de objeto permiten a los desarrolladores declarar y crear objetos de variables mediante una sintaxis declarativa basada en etiquetas. El siguiente ejemplo muestra como la etiqueta del objeto puede utilizarse para crear una instancia de la clase ArrayList. <object id="items" class="System.Collections.ArrayList" runat="server"/> El objeto ser creado automticamente en tiempo de ejecucin y podr ser accedido mediante el ID "items". void Page_Load(Object sender, EventArgs e) {

items.Add("One"); items.Add("Two");

items.Add("Three"); ... } C# Reference6.aspx

Sintaxis de los Comentarios del Lado de Servidor: <%-- Comment --%> Los comentarios del lado del servidor permiten a los desarrolladores evitar la ejecucin y rederizado de cdigo de servidor (incluyendo controles de servidor) y de contenido esttico. El siguiente ejemplo muestra como bloquear el contenido para que no se ejecute y sea enviado al cliente. Observar como todo lo que hay entre <% -- y -- %> se filtra y slo es visible en el fichero que hay en el servidor, aunque incluya otras directivas ASP.NET. <%-<asp:calendar <% Hello <% --%> C# Reference7.aspx for (int id="MyCal" i=0; World } i<45; i++) runat=server/> { %> <br> %>

Sintaxis de Inclusin (Includes) del Lado de Servidor: <-- #Include File="Locaton.inc" --> Los #Includes permiten a los desarrolladores insertar los contenidos de un fichero especificado en cualquier lugar de una pgina ASP.NET. El siguiente ejemplo nos demuestra como insertar una cabecera y un pie de pgina personalizados en una pgina.

<!-...

#Include

File="Header.inc"

-->

<!-- #Include File="Footer.inc" --> C# Reference8.aspx

Sintaxis de Expresin: <%$ ... %> Nuevo en 2.0 ASP.NET 2.0 aade una nueva sintaxis declarativa para substituir los valores en una pgina antes de que sea analizada. sto es til para substituir los valores de cadenas de conexin o configuraciones de una aplicacin por los valores de las propiedades de controles de servidor, definidas en el fichero Web.config. Tambin se puede usa para substituir valores de un fichero fuente de localizacin. Se puede encontrar ms sobre cadenas de conexin, expresiones de recursos y manejadores de expresiones en las secciones Realizando Acceso a Datos, Internacionalizando Vuestra Aplicacin y Extendiendo ASP.NET. <asp:SqlDataSource connectionStrings:Pubs SelectCommand="sp_GetAuthors" %>' runat="server"/> ID="SqlDataSource1" %>' ConnectionString='<%$ runat="server" />

<asp:Label ID="Label1" Text='<%$ Resources: ExchRate, ConvertLabel

Efectuando Acceso a Datos Lo nuevo en 2.0

Controles de Fuente de Datos - ASP.NET 2.0 introduce controles declarativos de fuente de datos que hacen accesibles los datos de almacenes internos (bases de datos SQL, objetos de negocios de capa intermedia o ficheros XML) a los controles de la interfaz de usuario (UI), para el enlazado a datos en una pgina. Los controles de fuente de datos

tambin tienen otras capacidades como la clasificacin, la paginacin, el "catching", la actualizacin, la insercin y la eliminacin de datos, que los controles de la UI puede aprovechar sin requerir ningn tipo de cdigo.

Nuevos Controles de Enlazado a Datos - Adems de los controles de enlazado a datos de ASP.NET 1.x, ASP.NET incluye nuevos controles de UI de enlazado a datos como el GridView, DetailsView,FormView, TreeView y Menu, que se pueden personalizar para mostrar los datos en diferentes formatos. Los controles GridView, DetailsView y FormView pueden, adems, aprovechar las capacidades de la fuente de datos, haciendo as ms sencillo las operaciones de clasificacin, paginacin y actualizacin en pginas orientadas a datos (data-driven).

Parmetros de Control de Datos - Las fuentes de datos pueden aceptar parmetros de entrada de diferentes fuentes utilizando los nuevos "objetos de parmetros" de controles de datos de ASP.NET 2.0. Estos "objetos de parmetros" nos permiten proporcionar fcilmente los valores de las propiedades de los controles de servidor (campos sesin, aplicacin, cookie y querystring) y las propiedades del perfil de usuario para operaciones de datos parametrizadas. La utilizacin de estos parmetros permite el filtrado y escenarios de "master-details" con poco cdigo o cdigo personalizado.

Sintaxis de Enlazado a Datos Mejorada - La sintaxis de enlazado a datos de DataBinder.Eval en ASP.NET se ha simplificado para el escenario comn de enlazar un control en una plantilla enlazada a datos. Es posible, adems, asociar dos formas de enlazar datos con las propiedades de un control en una plantilla para permitir, de esta forma, que los valores se pasen automticamente para la actualizacin, insercin o borrado en la fuente de datos. Para datos XML jerrquicos ASP.NET 2.0 tambin incluye una sintaxis de enlazado a datos basado en XPath.

Bases de Datos de Ficheros Locales Utilizando SQL Express - Para un desarrollo ms sencillo, ASP.NET 2.0 soporta la habilidad de conectar con una base de datos SQL Express como un fichero local de la aplicacin, eliminando la necesidad de enviar la base de datos a un servidor slo para

realizar el trabajo de desarrollo. Por supuesto, tambin podemos seguir conectndonos a las bases de datos de un servidor SQL. Esta seccin describe stas y otras caractersticas del acceso a datos en ASP.NET 2.0. Prcticamente todas las aplicaciones Web dinmicas realizan algun tipo de acceso a datos y, afortunadamente, ASP.NET 2.0 facilita mucho esta accin. A diferencia de ASP.NET 1.0, que requera que los desarrolladores escribieran cdigo personalizado para recuperar y enlazar los datos a controles de servidor, ASP.NET 2.0 permite una solucin declarativa para el enlazado a datos que requiere poco cdigo para los escenarios de datos ms comunes, como por ejemplo:

Seleccionar y Mostrar Datos Ordenar, Paginar y Cachear Datos Actualizar, Insertar y Borrar Datos Filtrar o "Master-Details" Utilizando Parmetros

ASP.NET 2.0 introduce dos tipos de controles de servidor que participan en este modelo declarativo de enlazado a datos. Estos dos tipos de controles de datos manejan toda la complejidad del modelo Web para escenarios de datos, de forma que los desarrolladores no tienen que entender los eventos del ciclo de vida de las peticiones para realizar el enlazado de los datos. Otro beneficio de este modelo basado en controles es que se puede extender de forma sencilla para soportar el acceso a datos de otros proveedores. Controles de Fuente de Datos Los controles de fuente de datos no se representan, sino que, en lugar de eso, representan un almacn de datos, como por ejemplo una base de datos, un objeto de negocio, un fichero XML o un Web Service XML. Los controles de fuente de datos tambin hacen posibles funconalidades ms "ricas" sobre los datos (clasificacin, paginacin, filtrado, actualizacin, borrado e insercin) que pueden

utilizar los controles de enlazado a datos de la UI de forma automtica. ASP.NET incluye los siguientes controles de servidor, por defecto: Nombre SqlDataSource Descripcin Permite enlazar a una base de datos SQL representada por un proveedor ADO.NET, como por ejemplo Microsoft SQL Server, OLEDB, ODBC, o Oracle. Permite enlazar a un objeto de capa intermedia como los de capa de acceso a datos o un componente de negocios.

ObjectDataSource

AccessDataSource Permite enlazar a una base de datos Microsoft Access (Jet). SiteMapDataSource Permite enlazar a la jerarquia mostrada por un proveedor de navegacin de sites de ASP.NET 2.0. XmlDataSource Permite enlazar a un fichero o documento XML.

Controles de Enlazado de Datos Los controles de enlazado de datos son controles de UI que renderizan los datos como marcas para los dispositivos o navegadores clientes. Un control de enlazado de datos puede auto-enlazar una fuente de datos a un dato mostrado y traer los datos en el momento apropiado dentro del ciclo de vida de la pgina. Estos controles puedes aprovecharse, opcionalmente, de las capacidades de la fuente de datos, como por ejemplo clasificacin, paginacin, filtrado, actualizado, borrado y insercin. Un control de enlazado de datos se conecta con una fuente de datos a travs de su propiedad DataSourceID. Podemos estar familiarizados con algunos de los controles de enlazado de datos de ASP.NET 1.x, como por ejemplo DataGrid, DataList, Repeater, y controles de lista como DropDownList. ASP.NET 2.0 contiene varios controles de enlazado de datos nuevos, como: Nombre GridView Descripcin Presenta los datos en formato de "rejilla" (grid). Es una evolucin del control DataGrid, y puede aprovechar automticamente las caractersticas de la fuente de datos.

DetailsView Presenta un slo elemento en una tabla de parejas etiqueta/valor, similar a la vista de formulario de Microsoft Access. Este control tambin puede aprovechar automticamente las caractersticas de la fuente de datos. FormView Presenta de la forma definida en una platilla personalizada un slo elemento de datos. Presenta un elemento en una tabla de parejas etiqueta/valor, similar a la vista de formulario de Microsoft Access. Este control tambin puede aprovechar automticamente las caractersticas de la fuente de datos. TreeView Menu Presenta los datos en una vista de rbol jerrquico de nodos expandibles. Presenta los datos en un men dinmico expandible (incluyendo flyouts).

Esta seccin demuestra stas y otras caractersticas nuevas de ASP.NET 2.0. Enlazando a Bases de Datos Uno de los tipos de datos ms comunes que se suelen representar en aplicaciones Web son datos provenientes de bases de datos SQL, como Microsoft SQL Server, Oracle, o otro almacn de datos OLEDB o ODBC. El control SqlDataSource representa una conexin directa a una base de datos en una aplicacin Web, que puede ser usada por los controles de enlazado de datos para obtener los datos de forma automtica. Se pretende que SqlDataSource reemplace al cdigo ADO.NET que escribiriamos normalmente para crear una conexin y hacer una peticin a una base de datos. Debido a que las peticiones de datos se especificar directamente como propiedades de los controles de fuente de datos, a veces se le llama "modelo de dos capas", ya que las peticiones de datos se mantienen en el cdigo de la pgina. Por esta razn, el control SqlDataSource est dirigido hacia los sitios pequeos hechos por hobby o personales, que no requieren una encapsulacin total de los objetos de datos de nivel medio. En posteriores secciones del tutorial se hablar del control ObjectDataSource, destinado a empresas mayores, que necesitan encapsulacin de nivel medio de las peticiones a base de datos.

El Control GridView Para demostrar como enlazar los datos desde una base de datos, los siguientes ejemplos aprovecharn el nuevo control de enlazado de datos llamado GridView. Dicho control es un nuevo control de enlazado de datos de ASP.NET 2.0 para presentar los datos en un formato de rejilla tabular. Cada fila de la rejilla corresponde a un registro de datos y las columnas representan los campos del registro. Si estis familiarizados con el control DataGrid de ASP.NET 1.x, el control GridView es el que lo reemplaza y tiene un modelo de objeto muy similar.

El control GridView soporta las siguientes caractersticas:


Vicular controles de fuente a datos. Capacidades de clasificacin. Capacidades de actualizacin y borrado. Capacidades de paginacin. Capacidades de seleccin de columnas. Acceso mediante cdigo al modelo de objeto GridView para poder establecer las propiedades y manejar los eventos. Nuevos tipos de columnas como CheckBoxField y ImageField. Mltiples campos de datos para las columnas de hiperenlaces. Mltiples campos de datos llaves para seleccin, actualiacin y borrado. Apariencia personalizable a travs de temas y estilos.

Creando un Informe de Datos El tipo ms simple que podemos encontrar en una pgina orientada a objetos es un informe de slo-lectura, que muestra los datos pero no permiten que el usuario manipule la presentacin o modifique los datos. Para crear un informe de slolectura de una base de datos SQL primero hay que configurar un SqlDataSource en la pgina y despus conectar un control enlazado a datos, como por ejemplo el GridView, a la fuente de datos, especificando la propiedad DataSourceID property. El siguiente ejemplo nos muestra un control GridView asociado a un SqlDataSource.

<form <asp:SqlDataSource ConnectionString="<%$ </form> ID="SqlDataSource1" ConnectionStrings:Pubs

runat="server"> runat="server" %>" />

<asp:GridView ID="GridView1" DataSourceID="SqlDataSource1" runat="server"/> SelectCommand="SELECT [au_id], [au_lname], [au_fname] FROM [authors]"

La propiedad ConnectionString del SqlDataSource especifica la cadena de conexin a la base de datos y la propiedad SelectCommand especifica la consulta a ejecutar para obtener los datos. La cadena de conexin se puede especificar literalmente en la pgina, pero en este caso hemos asignado dicha propiedad mediante una nueva expresin que obtiene el valor del fichero Web.config. En el siguiente ejemplo, un control GridView se enlaza a un control SqlDataSource conectado a una base de datos Microsoft SQL Server. C# GridView-SqlDataSource

El control SqlDataSource no se limita a conexiones con bases de datos de Microsoft SQL Server, sino que en realidad puede conectarse a cualquier proveedor ADO.NET configurado como System.Data.Common.DbProviderFactory. Por defecto, hay cuatro proveedores incluidos en el fichero machine.config del Framewrok .NET. <configuration> <system.data> <DbProviderFactories> <add <add name="Odbc name="OleDb Data Data Provider" Provider" invariant="System.Data.Odbc" ..." ..." ..." /> /> /> invariant="System.Data.OleDb" type="System.Data.Odbc.OdbcFactory, type="System.Data.OleDb.OleDbFactory, type="System.Data.OracleClient.OracleClientFactory,

<add name="OracleClient Data Provider" invariant="System.Data.OracleClient"

<add

name="SqlClient

Data

Provider"

invariant="System.Data.SqlClient" ..." />

type="System.Data.SqlClient.SqlClientFactory, </DbProviderFactories> </system.data> </configuration>

La propiedad ProviderName de SqlDataSource se puede establecer a un nombre invariante de cualquier proveedor (por defecto System.Data.SqlClient). Observar que si cambiamos el nombre de proveedor tendremos que asegurarnos que las propiedades ConnectionString y SelectCommand utilizan la sintaxi correcta para el proveedor seleccionado.

En el ejemplo anterior, el control GridView se "reflejaba contra" los campos de los registros de datos devueltos por SqlDataSource para generar dinmicamente las columnas de la rejilla. Tambin podemos especificar las columnas explcitas que queremos mostrar aadiendo objetos DataControlField a la coleccinde Columnas del GridView. Esto nos permite especificar exactamente que columnas hay que mostrar y su orden relativo. El siguiente ejemplo muestra una coleccin de objetos BoundField y CheckBoxField en la coleccin de Columnas del GridView. Otro tipo de campos que pueden ser asignados a esta coleccin son ImageField, HyperLinkField, CommandField, ButtonField y TemplateField. C# GridView-SqlDataSource (BoundFields)

La propiedad SelectCommand de SqlDataSource tambin se puede configurar con un nombre de procedimiento almacenado en lugar de un comando SQL. Para permitir esto, hay que establecer la propiedad SelectCommandType a "StoredProcedure". El siguiente ejemplo muestra el contro SqlDataSource

configurado para seleccionar datos de un procedimiento almacenado en la base de datos Northwind. C# GridView-SqlDataSource (Procedimiento Almacenado)

Por defecto el control SqlDataSource devuelve un objeto DataView desde un objeto DataSet que contiene los resultados de la consulta. Podemos configurar el control SqlDataSource para devolver los datos como un objeto DataReader en su lugar, estableciendo la propiedad SqlDataSourceMode a "DataReader". Utilizar un DataReader es, generalmente, mejor en cuanto a rendimiento que utilizar un DataSet cuando slo necesitamos acceso read-only o "fordward-only" a los datos. Sin embargo, es importante observar que la capacidad de clasificacin del control SqlDataSource se deshabilitar en este modo. El siguiente ejemplo muestra el modo DataReades del control SqlDataSource. C# GridView-SqlDataSource (DataReader)

Configuracin de Cadenas de Conexin En los ejemplos anteriores, SqlDataSource hace referencia a la cadena de conexin a la base de datos por su nombre, utilizando la nueva sintaxis declarativa de ASP.NET 2.0 que resuelve el valor de la cadena de conexin en tiempo de ejecucin. La cadena de conexin se almacena en el fichero Web.config en la seccin de configuracin <connectionStrings>, de forma que es sencillo de mantenerlo en un solo lugar para todas las pginas de la aplicacin. <configuration> <connectionStrings> <add name="Pubs" connectionString="Server=(local);Integrated /> Security=True;Database=pubs;" providerName="System.Data.SqlClient"

</connectionStrings> </configuration> El siguiente ejemplo muestra el fichero Web.config utilizado por los anteriores ejemplos de SqlDataSource. Configuracin de Cadenas de Conexin

Almacenar las cadenas de conexin en el fichero Web.config es una prctica recomendada para cualquier aplicacin ASP.NET, no slo para su administracin centralizada, sino para hacer ms seguras las cadenas de conexin. En ASP.NET 2.0 hay disponible una herramienta de linea de comandos para el encriptado de esta seccin para una mayor seguridad en ambientes de produccin. Para ms de talles sobre el encriptado de cadenas de conexin acudid a la seccin "Encriptado de Secciones de Configuracin" de la seccin de administracin de este tutorial. El siguiente ejemplo muestra el fichero Web.config con una seccin <connectionStrings/> encriptada. Configuracin de Cadenas de Conexin (Encriptadas)

La propiedad ConnectionString del control SqlDataSource se establece a la expresin <%$ ConnectionStrings:Pubs %>, que es traducida por el analizador de ASP.NET al valor de la cadena de conexin en tiempo de ejecucin. Tambin podemos especificar una expresin para la propiedad ProviderName de SqlDataSource, por ejemplo <%$ ConnectionStrings:Pubs.ProviderName %>. Clasificacin y Paginacin de Datos Una de las principales ventajas del control GridView sobre otros controles de enlazado de datos es su habilidad para aprovechar las propiedades de la fuente de datos. En lugar de dejar en manos del cdigo de la pgina la clasificacin o

paginacin de los datos, el control GridView puede realizar estas operaciones de forma automtica, siempre que la fuente de datos est configurada para ello.

El

control

SqlDataSource

soporta

la

clasificacin

cuando

la

propiedad

DataSourceMode se configura como "DataSet". Para permitir clasificacin en la UI usando un control GridView hay que configurar la propiedad AllowSorting a "verdadero". sto provoca que el control GridView cree botones de enlazado para las cabeceras de sus columnas, en los que podamos hacer clic para clasificar la columna. El control GridView pasa la expresin SortExpression asociada con el campo de la columna al control de la fuente de datos, que devuelve los datos clasificados al GridView.

La sintaxis de SortExpression que espera SqlDataSource es la misma que la de la propiedad Sort de System.Data.DataView, aunque otras fuentes de datos pueden soportar sintaxis diferentes. Debido a que el comportamiento de clasificacin de SqlDataSource depende la propiedad DataViewSort, SqlDataSource slo soporta la clasificacin en modo DataSet; si se configura como DataReader, la clasificacin se deshabilita. Normalmente asignaremos el SortExpression a un slo nombre de campo asociado con una columna del GridView. El GridView alternar de forma automtica entre "ASC" o "DESC" en SortExpression en cada clic, para conmutar entre orden de clasificacin ascendente o descendente. C# Clasificacin del GridView

Tambin podemos permitir la paginacin de la UI en el control GridView, poniendo la propiedad AllowPaging a verdadero. El GridView puede paginar cualquier valor devuelto por una fuente de datos que soporte la interfaz ICollection. El DataView que devuelve SqlDataSource cuando est en en modo DataSet soporta dicha

interfaz, de forma que GridView puede (paginar)"page over" el resultado. Cuando se encuentra en mode DataReader, el GridView no puede "page over" los datos devueltos por SqlDataSource. El siguiente ejemplo nos muestra la UI de paginacin del GridView con un SqlDataSource en modo DataSet.. C# Paginacin de GridView

Tambin podemos personalizar el estilo y la configuracin del paginador, configurando las propiedades PagerStyle y PagerSettings, respectivamente. PagerStyle determina el aspecto y la sensacin del paginador, mientras que PagerSettings determina el tipo de paginacin a usar (numrica o con botones Siguiente/anterior), la posicin del paginador y opciones relacionadas. El siguiente ejemplo muestra algunos de estos estilos y ajustes aplicados al paginador de GridView. C# Ajustes del Paginador de GridView

Observar que la operacin de paginacin del anterior ejemplo la est realizando ntegramente el control GridView sobre el DataView devuelto por SqlDataSource, que soporta la interfaz ICollection. En este caso, el GridView obtiene todos los datos de la fuente de datos, presenta un subconjunto de las filas y despus descarta las restantes. A esto se le llama a veces "paginacin UI", porque la lgica de paginacin se da en la capa de presentacin del control GridView. Aunque sea conveniente para paginar colecciones arbitrarias, sta no es la forma ms eficiente de paginar los datos. tambin es posible configurar la paginacin en el nivel de la interfaz de la fuente de datos, de forma que el GridView solo pide a la fuente de datos las filas que necesita para representar la pgina. El control SqlDataSource no soporta, por ahora, paginacin a nivel de interfaz. El control ObjectDataSource

no soporta esta caracterstica, y de esto se habla en el topic "Clasificacin y Paginacin Avanzadas" de este tutorial. Actualizando y Borrando Datos Adems de clasificacin y paginacin, el control GridView tambin permite preparar la UI para la modificacin de los datos mediante operaciones de Actualizacin y Borrado, siempre que la fuente de datos asociada se configure para soportar dichas funcionalidades. El control SqlDataSource soporta las operaciones de Actualizacin cundo se establece la propiedad UpdateCommand y las de Borrado cuando la propiedad DeleteCommand se establece a un comando vlido de actualizacin o borrado o a un procedimiento almacenado. UpdateCommand o DeleteCommand deben contener parmetros de substitucin para cada valor que pasar el control GridView (ms sobre esto abajo). Tamnbin podemos especificar una coleccin de UpdateParameters o DeleteParameters para establecer las propiedades de cada parmetro, tales como el tipo de parmetro, la direccin de entrada/salida o el valor por defecto. Se hablar ms detalladamente sobre estas colecciones en los siguientes captulos.

<asp:SqlDataSource ConnectionString="<%$ SelectCommand="SELECT [authors]"

ID="SqlDataSource1" ConnectionStrings:Pubs [au_id], [au_lname], [au_fname],

runat="server" %>" [state] FROM

UpdateCommand="UPDATE [authors] SET [au_lname] = @au_lname, [au_fname] = @au_fname, [state] = @state WHERE [au_id] = @au_id" DeleteCommand="DELETE FROM [authors] WHERE [au_id] = @au_id"/> Para permitir la Actualizacin y el Borrado desde la UI en el GridView, podemos establecer las propiedades AutoGenerateEditButton y AutoGenerateDeleteButton a verdadero, o aadir un CommandField al control GridView y habilitar sus propiedades ShowEditButton y ShowDeleteButton. El GridView soporta la edicin o borrado de una fila cada vez. Para editar, el usuario pondra la fila en modo de edicin haciendo clic sobre el botn "Edit" y despus

confirmar la Actualizacin haciendo clic sobre el botn "Update" mientras la fila est en modo de edicin. El usuario tambin puede hacer clic sobre el botn "Cancel" para cancelar la operacin de edicin y volver al modo de slo-lectura. El siguiente ejemplo muestra el GridView y la SqlDataSource configurados para la actualizacin de filas de datos.

C#

Actualizacin

del

GridView

Una propiedad importante que juega un papel especial en las operaciones de Actualizacin y Borrado es la propiedad de DataKeyNames. Esta propiedad se fija al valor de los nombres de los campos de la fuente de datos que forman parte de la llave primaria mediante la que podremos localizar una fila concreta en la fuente de datos. Cuando especificamos esta propiedad de forma declarativa, tendremos que separar por comas los diferentes campos, aunque normalmente se suele tener un slo campo llave. Los valores de los campos especificados en la propiedad DataKeyNames son de ida y vuelta, para poder mantener los valores originales que tendremos que pasar a las operaciones de Actualizacin y Borrado, incluso si el campo no se va a presentar como una columna en el control GridView. Cundo GridView invoca las operaciones de Actualizacin o Borrado de la fuente de datos, pasa los valores de estos campos en un diccionario de Llaves especiales, diferente al diccionario de Valores que contiene los nuevos valores que ha introducido el usuario mientras la fila estaba en modo de edicin (para operaciones de actualizacin). Los contenidos del diccionario de Valores se obtienen de los controles de entrada presentados en la fila en el modo de edicin. Para excluir un valor de este diccionario, tendremos que establecer la propiedad ReadOnly a verdadero en el correspondiente BoundField dentro del grupo de columnas. Si estamos usando el diseador de GridView de Visual Studio, la propiedad ReadOnly se pone a verdadero por defecto, para los campos de las llaves primarias.

Observar la convencin en la nomenclatura de los parmetros en la sentencia de Actualizacin asignada a UpdateCommand. La capacidad automtica de invocacin la operacin de Actualizacin que tiene el GridView y otros controles de enlazado de datos depende de la convencin de la nomenclatura para su funcionamiento. Los parmetros deben ser nombrados como los valores de los campos asociados devueltos por el SelectCommand. Mediante este acuerdo en la nomenclatura se hace posible alinear los valores pasados por el control de enlazado de datos a la fuente de datos con los parmetros de la sentencia de actualizacin SQL. La utilizacin de esta convencin en la nomenclatura asume que el contenido de los diccionarios de Llaves y los de Valores son mutuamente excluyentes (es decir, los valores de los campos que deben ser actualizados por el usuario, mientras que el control de enlazado de datos est en modo de edicin, deben nombrarse de forma diferente a los valores de los campos utilizados para encontrar la fila a acualizar (en la clusula WHERE de SqlDataSource)). Otra forma de ver sto es que cualquier campo que se encuentre en DataKeyNames deber ser de slolectura o invisible en el control de enlace de datos (por ejemplo, en el conjunto de Columnas de GridView).

A pesar que es comn que los campos llave sean de slo-lectura, hay casos en los que querremos que se puedan actualizar campos que tambin se usan para encontrar la fila de datos a actualizar. Por ejemplo, si establecemos la propiedad ReadOnly=false en un campo del conjunto de Columnas de GridView que tambin forma parte de DataKeyNames, GridView pasar el antiguo valor al campo correspondiente del diccionario de Llaves, mientras que pasar el nuevo valor al campo del diccionario de Valores. Para diferenciar entre estos dos valores, necesitaremos nombrar los parmetros de forma diferente en la sentencia SQL, por ejemplo: <asp:SqlDataSource ConnectionString="<%$ ID="SqlDataSource1" ConnectionStrings:Pubs runat="server" %>"

SelectCommand="SELECT [authors]"

[au_id],

[au_lname],

[au_fname],

[state]

FROM

UpdateCommand="UPDATE [authors] SET [au_id] = @au_id, [au_lname] = @au_lname, [au_fname] = @au_fname, [state] = @state WHERE [au_id] = @original_au_id" DeleteCommand="DELETE FROM [authors] WHERE [au_id] = @original_au_id"/> OldValuesParameterFormatString="original_{0}" En este ejemplo, el parmetro de nombre @original_au_id se usa para hacer referencia al valor original del campo llave y @au_id para el nuevo valor. La propiedad OldValuesParameterFormatString de SqlDataSource tambin se establece a un formato de string vlido para el Framework .NET para indicar cmo deben ser renombrados los parmetros en el diccionario de Llaves. Este formato tambin se aplica a los viejos valores de los campos que no son llave que pasa el control de enlace de datos cuando la propiedad ConflictDetection de SqlDataSource se establece a CompareAllValues. En las operaciones de Borrado, SqlDataSource aplica el diccionario de Llaves por defecto (no hay nuevos valores para la operacin de borrado), usando el valor de la propiedad OldValuesParameterFormatString para dar formato a los nombres de los parmetros llave.

Filtrado de Datos Un escenario comn en las pginas orientadas a datos es la habilidad de filtrar los datos en un informe. Por ejemplo, supongamos que un usuario pueda seleccionar entre unos valores de una DropDownList para filtrar la cuadrcula del informe de manera que slo se muestren las filas que coincidan con el valor del campo. En ASP.NET 1.x necesitbamos escribir todo este cdigo: 1. Cancelar el enlace de datos en el Page_Load si la consulta es un postback 2. Manejar el evento SelectedIndexChanged 3. Aadir el SelectedValue de la DropDownList a la coleccin de Parmetros de los comandos

4. Ejecutar el comando y llamar a DataBind En ASP.NET 2.0 se elimina este cdigo mediante el uso de objetos Data Parameter declarativos. Un "data parameter" permite que los valores externos se asocien a operaciones de la fuente de datos de forma declarada. Estos parmetros normalmente se asocian a una variable en un comando o propiedad, por ejemplo, un parmetro de una sentecia SQL o un procedimiento almacenado para SqlDataSource. Los controles de la fuente de datos permiten acceder a las grupo de propiedades de parmetros que contienen los objetos paramtricos para cada operacin de datos soportada. Por ejemplo: <asp:DropDownList ... <asp:SqlDataSource ConnectionString="<%$ SelectCommand="SELECT [authors] <SelectParameters> <asp:ControlParameter PropertyName="SelectedValue" </SelectParameters> </asp:SqlDataSource> El siguiente ejemplo nos muestra un QueryStringUtilizado para obtener un valor paramtrico del querystring del URL de consulta: C# Filtrado por QueryString Name="state" ControlID="DropDownList1" /> WHERE [au_id], ID="SqlDataSource1" ConnectionStrings:Pubs [au_lname], [state] [au_fname], = [state] runat="server" %>" FROM @state"> ID="DropDownList1" ... runat="server"/>

El siguiente ejemplo nos muestra como un ControlParameter se usa para obtener el valor de un parmetro de un control DropDownList de la pgina:

C#

Filtrado

por

DropDownList

Podemos configurar los parmetros de datos para devolver valores de cualquiera de las siguientes fuentes: Nombre Parameter Descripcin La clase Parameter es la base comn de la que derivan el resto de tipos de Parmetros. La clase Parameter tambin siver como implementacin de parmetros estticos, dnde el valor se especifica de forma esttica mediante la propiedad DefaultValue.

Parameters comparte la propiedad Name comn, que es el nombre del parmetro para el funcionamiento de la fuente de datos (por ejemplo, esto encontrar el nombre del parmetro en el SelectCommand para SqlDataSource). Todos los parmetros comparten, tambin, la propiedad Type, que especifica cul es el tipo del valor del parmetro. Los parmetros tambin comparten la propiedad Direction, que se usa para especificar dnde usamos el parmetro como entrada, salida (o ReturnValue) o ambos, entrada y salida. Las fuentes de datos suelen mostrar los parmetros de salida y devolver valores de un evento "args" que se pasa al evento de estado de operacin de la fuente de datos. Para un ejemplo de lo aqu descrito ir a "Trabajando con Parmetros". La clase QueryStringParameter enlaza el valor de un QueryStringParameter campo querystring al valor del objeto Parameter. La propiedad QueryStringField encuentra el nombre del campo querystring desde el que se recupera el valor. La propiedad DefaultValue se devolver siempre que el valor querystring no est disponible.

ControlParameter

La clase ControlParameter enlaza el valor de una propiedad Control al valor de un objeto Parameter. La propiedad ControlID encuentra la ID del Control cuya propiedad est enlazada al parmetro. La PropertyName especfica la propiedad del control desde la que se obtiene el valor. El control del cul especificamos la ID mediante ControlID puede definir, opcionalmente, un ControlValuePropertyAttribute, que determina el nombre de propiedad por defecto del que obtendremos el valor del control. Esta propiedad se utilizar cuando no se establezca explcitamente el PropertyName. El ControlValuePropertyAttribute se aplica a las siguientes propiedades de control:

Label.Text TextBox.Text ListControl.SelectedValue DropDownList) CheckBox.Checked Calendar.SelectedDate DetailsView.SelectedValue GridView.SelectedValue TreeView.SelectedValue FileUpload.FileBytes

(por

ejemplo,

SessionParameter

La clase SessionParameter enlaza el valor de un objeto de Session con el valor de un objeto Parameter. La propiedad SessionField encuentra el nombre de la clave se Session desde la que se obtiene el valor. La propiedad DefaultValue se devolvera si no se puede acceder al valor de Session.

FormParameter

La clase FormParameter vinvula el valor de un campo de un formulario HTML al valor de un objeto Parameter. La propiedad FormField encuentra el nombre del campo del formulario desde el que se obtendr el valor. La propiedad DefaultValue se devolver cuando el valor de Form no est disponible.

CookieParameter

La clase CookieParameter enlaza el valor de un HttpCookie al valor de un objeto Parameter. La propiedad CookieName encuentra el nombre de la cookie desde la

que se obtendr el valor (slo se admiten cookies de valor simple "simple-valued"). La propiedad DefaultValue se devolver cuando la cookie no est disponible.

ProfileParameter

La clase ProfileParameter enlaza el valor de un objeto "User Profile" al de un objeto Parameter. La propiedad ParameterName encuentra el nombre del perfil desde el que se obtendr el valor. La propiedad DefaultValue se devolver cuando la cookie no est disponible. Para ms informacin, acudir a la seccin "Perfiles de Usuario" del tutorial.

Observar la diferencia entre los parmetros de datos que se evaluan en una fuente interna (Control QueryString, etc.) y los que se pasan para las operaciones Actualizar, Insertar y Borrar de los ejemplos anteriores. En el ltimo escenario, los valores de los parmetros son proporcionados dinmicamente por el control de enlace de datos, en este caso GridView, qu invoca la operacin de Actualizacin. Para las operaciones de Actualizacin, Insercin y Borrado normalmente no necesitaremos parmetros de datos asciados a valores externos. Sin embargo, podemos incluir un objeto <asp:Parameter> (clase base para todos los parmetros de datos) en los grupos UpdateParameters, InsertParameters o DeleteParameters de la fuente de datos, para especificar propiedades como Type, Direction o DefaultValue (valor a usar si el que pasa GridView es null), para ser aplicadas a los valores de los parmetros pasados desde el control GridView. Cacheando Datos Otra caracterstica de la fuente de datos es la capacidad de chachear los datos de forma automtica. A pesar que seguimos podiendo utilizar las API's de cach para chachear los datos mediante programacin, estableciendo unas pocas caractersticas de forma declarativa en la fuente de datos podemos obtener el mismo resultado. Para permitir el cacheo para el control SqlDataSource (y ObjectDataSource, que se explica ms adelante), tendremos que fijar la propiedad EnableCaching a verdadero.Podemos especificar el tiempo (en segundos) durante el que almacenaremos una entrada en cach, mediante la propiedad

CacheDuration.

Tambin

podemos

establecer

la

propiedad

CacheExpirationPolicy tanto a either Sliding como a Absolute, como podemos hacer desde la API de cach. El cachero slo es soportado por el control SqlDataSource cundo la propiedad DataSourceMode se fija a "DataSet".

Por ejemplo, si fijamos CacheDuration a 5 y SlidingExpiration a Absolute, el SqlDataSource recuperar los datos de la base de datos en la primera peticin a la pgina, y los almacenar en la cach. Para las peticiones siguientes, la SqlDataSource intentar obtener la entrada de la cach para responder la peticin sin tener que mirar en la base de datos. Despus de 5 segundos (o quiz antes, si la presin de la memoria cach es alta), la entrada de la cach se eliminar y para la siguiente peticin el SqlDataSource tendr que volver a la base de datos de nuevo (repitiendo el proceso de cacheo para los nuevos datos).

Si en lugar de eso fijamos CacheDuration a 5 y SlidingExpiration a Sliding, se refrescar el time-to-live de los datos cacheados peridicamente mientras la fuente de datos los pida al menos una vez cada 5 segundos. Si una pgina pide los datos cacheados por lo menos una vez cada 5 segundos, y no hay presin en la memoria cache, los datos cacheados se mantendrn en la cache para siempre. Por otra parte, si no se hacen peticiones de los datos cacheados en un periodo de 5 segundos, se eliminarn los datos de la cach y la prxima vez que se produzca una peticin el control SqlDataSource volver a pedir los datos a la base de datos original.

El siguiente ejemplo muestra el cacheo mediante el control SqlDataSource. La columna TimeStamp se actualiza en cada peticin, de forma que podemos ver la asiduidad con la que los datos se cogen de la base de datos frente a los que se piden de la cach. Observar que aproximdamente cada 5 segundos se actualiza el TimeStamp.

C#

"Caheando"

SqlDataSource

Un observador minucioso puede haberse dado cuenta que el TimeStamp tambin se actualiza cada vez que se selecciona un nuevo valor para el filtro de la DropDownlist. sto se debe a que cada conjunto de parmetros nico que se le pasa al SelectCommand tiene como resultado una peticin diferente a la base de datos y, poe consiguiente, una entrada diferente en la cach (observar que si seleccionamos el mismo valor en la DropDownList en un perodo de tiempo de 5 segundos el TimeStamp no vara).

Un enfoque alternativo, que funciona bien con peticiones de datos ms pequeos, consiste en seleccionar todos los datos de la base de datos y pasarlos a la cach, para luego filtrar esa nica entrada de la cach para los diferentes valores de los parmetros. Para soportar sto, el control SqlDataSource soporta la propiedad FilterExpression y el grupo correspondiente de FilterParameters. En lugar de aplicar los valores de los parmetros directamente sobre el comando (cmo hacamos en los SelectParameters), la expresin de filtrado se aplica sobre la propiedad RowFilter del objeto DataView devuelto por la ejecucin del comando. La sintaxis de la expresin debe encajar con la esperada para la propiedad RowFilter del DataView. Row Filter Podemos usar parmetros de substitucin para los valores de los parmetros dentro de la FilterExpression siguiendo el estndard del Framework .NET para la sintaxis de formato de strings, por ejemplo "{0}", "{1}" y sucesivamente. en tiempo de ejecucin, el control SqlDataSource aplica los valores de los parmetros especificados en el grupo FilterParameters a FilterExpression, dado formato al string con los valores. Observar que los valores de los parmetros no son "escaped", de manera que ser necesario que los pongamos entre comillas simples.

<asp:DropDownList ... <asp:SqlDataSource ConnectionString="<%$ SelectCommand="SELECT [authors]"> FilterExpression="state <FilterParameters> <asp:ControlParameter

ID="DropDownList1" ID="SqlDataSource1"

...

runat="server"/> runat="server" %>" [state] FROM '{0}'"

ConnectionStrings:Pubs [au_id], [au_lname], = Name="state" [au_fname],

ControlID="DropDownList1" />

PropertyName="SelectedValue" </FilterParameters> </asp:SqlDataSource> El siguiente ejemplo muestra esta tcnica de filtrado en accin: C# Filtrando Entradas de

Cach

El cacheo de datos debe mantener un compromiso entre rendimiento (no tenemos que volver a la base de datos en cada peticin) y los datos obsoletos (porque la entrada de cach contiene una instantnia de los datos capturados en un momento dado). Normalmente usamos valores relativamente pequeos en CacheDuration, para asegurarnos que los datos de la cach estn actualizados. Una situacin ideal consistira en invalidar la entrada de la cach nicamente cundo los datos subyacentes cambiaran. Mientras los datos no hayan cambiado, no hay ninguna razn para eliminar la entrada de la cach.

Una nueva caracterstica de ASP.NET 2.0 llamada SQL Cache Invalidation, nos permite configurar la fuente de datos para cachear los datos de forma indefinida (o por una duracin especificada) hasta que los datos de la base de datos cambien, momento en el que la entrada de la cach se elimina. Esta tcnica nos permite

utilizar valores mucho mayores para CacheDuration y continuar garantizando que los datos que mostramos coinciden con los valores de la base de datos. SQL Cache Invalidation slo es soportado por las bases de datos Microsoft SQL Server. Hay dos implementaciones de esta funcin: una basada en notificaciones, soportada por SQL Server 2005, y otra basada en votaciones (polling), soportada por versiones anteriores de SQL Server. La seccin de SQL Cache Invalidation nos describe los pasos necesarios para configurar ambas implementaciones. Una vez hemos configurado la SQL Cache Invalidation, podemos utilizarla desde el control en de la fuente este Si la de datos, valor usamos especificando un a la propiedad del basada tipo en SqlCacheDependency de la fuente de datos. Si usamos la implementacin basada votaciones, fijaremos acepta la formato connectionName:tableName. notificaciones, implementacin

propiedad

"CommandNotification".

En este ejemplo, fijamos el CacheDuration a "Infinite" y especificamos SqlCacheDependency. Observar que la columna TimeStamp no se actualiza hasta que los datos se modifican mediante el botn "Edit" del GridView. C# SqlCacheInvalidation de la Fuente de Datos

Master-Details y el Control DetailsView En la seccin de Filtrado de Datos vimos cmo los controles de la fuente de datos pueden aceptar parmetros de fuentes externas, tales como controles de un formulario, valores de querystring, y otros. Una tcnica similar se puede emplear para crear un escenario de "master-details". Master-details se suele referir a un "convenio (Arreglo)" entre controles, en el que un registro seleccionado en un control (el control "master") muestra detalles adicionales para el registro seleccionado en otro control (el control "details"). Los detalles adicionales pueden ser propiedades del mismo elemento de datos, o registros relacionados que estn asociados al elemento de datos "master" a travs de una relacin clave externa en

la

base

de

datos.

El control GridView soporta la propiedad SelectedValue, qu indica la fila que est seleccionada en el GridView. La propiedad SelectedValue evala el valor del primer campo especificado en la propiedad DataKeyNames. Podemos permitir la UI para la seleccin el el GridView fijando AutoGenerateSelectButton a verdadero, o aadiendo al grupo de columnas del GridView un CommandField con ShowSelectButton fijado a verdadero. Una vez hecho esto, la propiedad SelectedValue del GridView puede ser asociada a un ControlParameter en una fuente de datos para pedir los registros de detalles, de la misma forma que configurbamos el DropDownList en los ejemplos anteriores.

Para mostrar ms detalles de la fila que est seleccionada, podemos usar otro control GridView, pero ASP.NET tambin incluye un nuevo control DetailsView que slo vale para eso. El control DetailsView presenta un solo registro cada vez, en lugar de un grupo de registros. De la misma forma que el GridView, DetailsView lo presenta en un formato tabulado, a excepcin de las filas correspondientes a cada campo de datos (como las columnas GridView). Los campos se especifican en el grupo Fields de DetailsView. Opcionalmente, el control DetailsView tambin puede paginar un grupo de registros, cmo lo hace GridView (en DetailsView, el PageSize siempre es 1). C# Master-Details w/ GridView and DetailsView

DetailsView soporta la edicin, al igual que lo haca GridView, y podemos permitir la UI de la misma forma, utilizando las propiedades AutoGenerateEditButton o CommandField.ShowEditButton. Por supuesto, la fuente de datos asociada al DetailsView tiene que ser configurada para soportar la operacin de actualizacin (en este caso, especificando un UpdateCommand en SqlDataSource). El siguiente

ejemplo demuestra un DetailsView configurado para soportar la edicin de registros en un escenario de master-details. C# Edicin de DetailsView

Normalmente los controles de enlazado de datos re-enlazan de forma automtica la fuente de datos cuando cambia la fuente de datos (por ejemplo, despus de una actualizacin). Sin embargo, en el ejemplo anterior, el DetailsView se enlaza a una fuente de datos diferente a la del GridView, de forma que cuando se invoca la operacin de actualizacin, solo el DetailsView recive el evento de cambio de su fuente de datos. Para forzar que el GridView tambin re-enlace cundo el DetailsView realiza una actualizacin, podemos llamar explcitamente al DataBind() del GridView en el evento ItemUpdated del DetailsView. Este ejemplo tambin maneja eventos para no permitir la edicin cundo una operacin de clasificacin o paginacin del gridView ocurre al mismo tiempo que se selecciona un valor de filtrado en el control DropDownList.

Tambin es comn el dividir la visualizacin del master-details a travs de varias pginas de una aplicacin Web. Para hacer sto podemos aadir un hipervnculo a cada fila del GridView para navegar a diferentes pginas de detalles, pasando argumentos mediante el querystring. En la pgina de detalles, la fuente de datos enlazada al DetailsView aceptar estos argumentos mediante un objeto QueryStringParameter. Un hipervnculo deber ser aadido al GridView aadiendo un objeto HyperLinkField al grupo de Columnas de GridView. La propiedad Text del HyperLinkField fija el texto a mostrar en el hipervnculo (por ejemplo "View Details..."), mientras que la propiedad NavigateUrl especifica la URL dnde navegaremos al hacer clic sobre el enlace. En lugar de especificar una URL esttica para todas las filas, es ms comn especificar NavigateUrlFields para

ser usado en la construccin de una URL dinmica. Se puede fijar NavigateUrlFields de forma declarativa a un conjunto de campos separados por comas, de la fuente de datos. La propiedad NavigateUrlFormatString especifica el formato del estndard del Framework .NET para la URL, mediante parmetros de substicutcin cmo {0} y {1} para substituis los valores del campo, en tiempo de ejecucin. Este ejemplo muestra un escenario master-details utilizando GridVIew y DetailsVIew en pginas separadas. A diferencia de los ejemplos anteriores, qu mostraban el GridView y el DetailsView enlaados a el mismo tipo de registro (un "author"), este ejemplo muestra diferentes tipos de registros para los controles "master" y "details" ("author" y "books"), saociados por relaciones clave externas en la base de datos. Debido a que un registro de un autor puede tener ms de un libro asociado, se ha configurado el DetailsView para soportar paginacin en los registros de libros, en la pgina de detalles. C# Master-Details (Pginas Separadas)

Insertando Datos Al igual que el control GridView, el control DetailsView soporta la Actualizacin y el Borrado de datos en su fuente de datos. Sin embargo, DetailsView tambin soporta la insercin de datos, cosa que no haca GridView. Podemos emparejar de forma sencilla un DetailsView con un GridView para permitir que se vean los registros de insercin en el GridView.

Para permitir que la SqlDataSource soporte Inserciones, tenemos que fijar la propiedad InsertCommand a un comando vlido de insercin, con parmetros de substitucin para el valor de cada campo que es representado por el DetailsView en el modo de Insercin. Tambin podemos, de forma opcional, especificar un grupo de InsertParameters que contengan los objetos de parmetros de datos para esta operacin.

Para

permitir

la

insercin

en

la

UI,

hay

que

fijar

la

propiedad

AutoGenerateInsertButton a verdadero o aadir al grupo de campos de DetailsView un CommandField con ShowInsertButton establecido a verdadero. Para pasar el DetailsView a modo de insercin, tenemos que hacer clic en el botn clic. DetailsView representar controles de entrada para cada campo cundo estemos en el modo de insercin. Observar que los campos marcados como "ReadOnly" se representan como controles de entrada en el modo de Insercin (a pesar que no lo haran en modo Actualizacin). Para excluir un campo en el modo de Insercin, tendremos que establecer la propiedad InsertVisible del campo a falso. Para realizar la operacin de Insercin, hay que hacer clic en el botn "Insert" mientras estamos en el modo de insercin. Para abortar la insercin, hacer clic en el botn "Cancel".

Cuando se ha llevado a cabo una operacin de insercin, el DetailsView recoge los valores de sus entradas y llena un diccionario de Valores que se pasar a la fuente de datos. El SqlDataSource aplica estos valores al grupo de parmetros de InsertCommand antes de ejecutar el comando. De la misma forma que con las Actualizaciones, la capacidad de insercin automtica recae en parmetros en el InserCommand, que se llamn exactamente de la misma forma que los campos que se devuelven en la operacin de seleccin. Observar que el diccionario de Claves no se requiere para la insercin. C# Insercin en Master-Details

Podemos situar el DetailsView en una pgina separada para realizar las operaciones de Insercin o Actualizacin. El siguiente ejemplo muestra un DetailsView configurado en una pgina separada para realizar las Inserciones y Actualizaciones. Observar que la propiedad DefaultMode se ha fijado en el ejemplo a Insert o Edit, de forma que DetailsView se representar inicialmente en

este modo, en lugar de el modo slo-lectura. Despus de una Insercin o una Actualizacin, DetailsView siempre vuelve al DefaultMode (por defecto ReadOnly). C# Insercin en Master-Details (Pginas Separadas)

Binding to Objects La seccin anterior nos mostraba cmo enlazar controles a SqlDataSource, qu soporta propiedades para la cadena de conexin que le especificamos, sentencias SQL o procedimientos almacenados utilizados para hacer peticiones o modificar la base de datos. Mientras que sto resulta conveniente para la mayora de sitios pequeos o hechos por hobby, almacenar directamente las sentencias SQL en las pginas de presentacin de una aplicacin puede volverse insostenible muy rpidamente para aplicaciones a nivel empresarial a gran escala. Estas aplicaciones suele requerir un modelo de datos ms encapsulado utilizando una capa de acceso a datos de nivel dalo o un componente de negocio (business). Afortunadamente, el control de fuente de datos de ASP.NET soporta este enfoque mediante el control ObjectDataSource.

El modelo de objeto del control ObjectDataSource es similar al del control SqlDataSource. En lugar de una propiedad ConnectionString, ObjectDataSource tiene una propiedad TypeName que especifica un tipo de objeto (nombre de clase) a inicializar para realizar las operaciones condatos. De forma similir a las propiedades de comando de SqlDataSource, el control ObjectDataSource soporta propiedades como SelectMethod, UpdateMethod, InsertMethod y DeleteMethod para especificar los mtodos de los tipos asociados a los que llamaremos para realizar estas operaciones de datos. Esta secin describe tcnicas para construir componentes de la capa de acceso a datos y de la capa de negocio (business) y hacerlos accesibles mediante un control ObjectDataSource.

Enlazando a una Capa de Acceso a Datos Un componente de la capa de acceso a datos encapsula el cdigo ADO.NET para consultar y modificar la base de datos mediante comandos SQL. Normalmente abstrae los detalles de crear una conexin y unos comandos ADO.NET, y en su lugar los hace accesibles a travs de mtodos a los que se puede invocar con los parmetros apropiados. Un componente tpico de la capa de acceso a datos se puede declarar de la siguiente forma: public public public public public public public } El ObjectDataSource se le puede asociar de la siguiente forma: <asp:ObjectDataSource TypeName="MyDataLayer" SelectMethod="GetRecords" UpdateMethod="UpdateRecord" DeleteMethod="DeleteRecord" InsertMethod="InsertRecord" runat="server"/> El ObjectDataSource requiere un patrn de diseo muy especfico para los objetos con los que puede trabajar. Estas restricciones son, principalmente, impuestas por el entorno esttico en el que se ejecutan las aplicaciones Web. Debido a que los objetos se crean y se destruyen para servir a cada peticin, el enlazada de dichos objetos con la fuente de datos debe ser tambin esttica. Por defecto, ObjectDataSource asume un constructor por defecto(sin argumentos) para el tipo especificado en la propiedad TypeName, aunque es posible instanciar este tipo en nombre de ObjectDataSource, haciendo que el evento ObjectCreating cree una instancia de objeto personalizada y la asigne a la propiedad ObjectInstance de los argumentos del evento. El mtodo asociado a la propiedad SelectMethod int int DataView DataView UpdateRecord(int int InsertRecord(int class DataView GetRecordsByCategory(String GetRecordByID(int recordID, DeleteRecord(int recordID, String String MyDataLayer { GetRecords(); categoryName); recordID); recordData); recordID); recordData);

puede devolver cualquier Objeto o lista IEnumerable, grupo o array. El el anterior ejemplo de la capa de acceso a datos, el objeto DataView implementa IEnumerable. Cmo se discutir en la siguiente seccin, estos mtodos deben, adems, devolver un grupo u objeto fuertemente tipado. GetProducts() GetProductsDataSet() GetProduct (int productId) -> Product Los mtodos Update, Insert y Delete han de coger campos de elementos de datos individuales como parmetros, o, opcionalmente, un objeto de una clase agregada con propiedades pblicas para los campos del elemento de datos. UpdateProduct UpdateProduct (int id, String p) // name, p.ID, double p.Name, price, bool inStock) p.InStock -> -> ProductCollection DataSet

(Product

p.Price,

DeleteProduct (int id) Cmo el ejemplo de SqlDataSource, los nombres de los parmetros o propiedades de los elementos de datos pasados a los mtodos Update, Delete o Insert deben coincidir con los nombres de los campos de elementos de datos que devuelve el mtodo SelectMethod para que funcionen las actualizaciones/borrados/inserciones automticos del GridView/DetailsView.Como en SqlDataSource, los parmetros de los mtodos ObjectDataSource se pueden asociar a objetos de parmetros de datos asignados a los grupos SelectParameters, FilterParameters, UpdateParameters, DeleteParameters o InsertParameters.

El siguiente ejemplo muestra un control ObjectDataSource que hace accesible los datos de un componente de la capa de acceso a datos llamado AuthorsDB. El fichero de clase de este tipo est en el directorio App_Code, que se compila dinmicamente en tiempo de ejecucin. C# Enlazando a una Capa de Acceso a Datos

Enlazando a una Capa de Lgica de Negocio (Business) Una cosa importante a observar de la capa de acceso a datos es que, debido a que el SelectMethod devuelve el resultado de ejecutar la consulta como un DataView, sigue mostrando el esquema de base de datos subyacente a las pginas de presentacin. Otra cosa a tener en cuenta es que no hay reglas de negocio en la capa de acceso a datos; simplemente se hace consultas y devuelve resultados. Para aislar la presentacin del esquema de la base de datos e introducir reglas de negocio o validacin, la capa de acceso a datos se envuelve en una capa de lgica de negocio.

Una capa de lgica de negocio es similar a una capa de acceso a datos en que hace deja accesibles mtodos a ObjectDataSource para enlazar controles en pginas Web. Sin embargo, en lugar de devolver directamente resultados ADO.NET, normalmente devuelve objetos fuertemente tipados que representar las entidades de negocio utilizadas por la aplicacin. sto separa la capa de presentacin del esquema de el almacn de datos subyacente, haciendo ms sencillo mantener separados la parte de acceso a datos del sitio, de las pginas que consumen los datos. Con una capa intermedia bien estructurada, podremos cambiar el almacn de datos a un esquema totalmente diferente sin tener que actualizar pginas individuales de la aplicacin.

Un ejemplo de la capa de lgica de negocio se da a continuacin. public public public public public public public public RecordCollection String Object int int class RecordCollection GetRecordsByCategory(String GetRecordByID(int GetRecordName(int GetRecordData(int UpdateRecord(Record DeleteRecord(Record RecordCollection MyBusinessLayer { GetRecords(); categoryName); recordID); recordID); recordID); r); r);

public public public } public public public public } int String Object int int

int

InsertRecord(Record ID, ID, String String

r); Data); Name);

UpdateRecordData(int UpdateRecordName(int

class ID Name Data { { {

Record get; get; get; set; set; set;

{ } } }

La principal diferentcia entre la capa de lgica de negocio y la capa de acceso a datos es que la primera devuelve un RecordCollection fuertemente tipado, de objetos "Record", en lugar de un DataView. Tambin nos premite la operaciones de Update, Insert y Delete que cogen este "Record" como parmetro. La propiedad DataObjectTypeName de ObjectDataSource nos permite configurar el ObjectDataSource para pasar este tipo a los mtodos, en lugar de valores de campos individuales. En las implementaciones de mtodos de la capa de lgica de negocio podemos incluir lgica personalizada para validar las reglas de negocio Por ejemplo, podemos asegurarnos que slo los "Records" de la categoria "In Review" se pueden actualizar, o que slo los administradores pueden insertar nuevos registros. Tambin podemos incluir lgica de validacin para asegurarnos que los tipos de datos y los valores proporcionados como argumentos son correctos antes de insertar o modificar los datos de la base de datos. Observar que la validacin en la capa de negocio no substituye la validacin de entrada en la capa de presentacin, qu ayuda a guiar al usuario final a introducir valores correctos antes de enviar la actualizacin.

El siguiente ejemplo muestra una simple capa de lgica de negocio (BLL) llamada AuthorsComponent. Internamente, esta BLL llama a la capa de acceso a datos (DAL) para realizar las operaciones en la base de datos. Por simplicidad, esta BLL no incluye ninguna regla o validacin de negocio, aunque en una aplicacin real lo

hara. Adems, cabe observar que en lugar de escribir nuestra propia clase de grupo para devolver registros fuertemente tipados, este ejemplo aprovecha una nueva caracterstica del Framework .NET 2.0, llamada "Generics", para crear un grupo de objetos Author. Mediante grupos fuertemente tipados, ObjectDataSource puede deducir el esquema de los objetos de negocio en tiempo de diseo (en Visual Studio y otras herramientas). C# Enlazando a una Capa de Lgica de Negocio

La siguiente ilustracin muestra la interacin entre el GridView, ObjectDataSource y la capa de lgica de negocio. El ObjectDataSource se configura para llamar al mtodo GetContacts del tipo ContactsList, que devuelve un grupo de objetos "Contact". El GridView enumera estos objetos Contactos y los enlaza directamente a las propiedades (ID, Name) de este tipo para crear sus columnas. Observar que el mtodo SelectMethod puede devolver tanto un IEnumerable de objetos Contact como un slo objeto Contact. El ObjectDataSource envolver siempre el resultado

del SelectMethod en un IEnumerable si no implementa IEnumerable por si slo.

Al igual que SqlDataSource, el control ObjectDataSource soporta la clasificacin cuando SelectMethod devuelve un objeto DataSet, DataView o DataTable. Internamente, el ObjectDataSource delega en la propiedad DataView.Sort para realizar la clasificacin. ObjectDataSource tambin soporta clasificaciones personalizadas en la implementacin de SelectMethod, lo cual es muy til si el mtodo no devuelve un DataSet, DataView o DataTable. La clasificacin personalizada se configura fijando la propiedad SortParameterName al nombre de un parmetro del mtodo que acepte el SortExpression de la fuente de datos. Cuando invocamos el SelectMethod, ObjectDataSource pasar esta expresin a nuestro mtodo y podremos implementar nuestra propia lgica de clasificacin usando esta expresin. El ejemplo anterior muestra la implementacin de una clasificacin personalizada en la clase "AuthorsComponent".

ObjectDataSource

tambin

soporta

paginacion

personalizada

en

la y

implementacin de SelectMethod. sto se configura mediante las propiedades StartRowIndexParameterName, and Sorting de este tutorial. MaximumRowsParameterName SelectCountMethod, y se trata con ms detalle en la seccin Advanced Paging

Enlazando a un DataSet de Visual Studio La construccin de una capa de enlace de datos (DAL) puede resultar tedioso debido a que, a menudo, el cdigo ADO.NET para ejecutar las sentencias SQL o los procedimientos almacenados es el mismo, o muy similar, para diferentes mtodos de la DAL. A pesar que podemos escribir nuestro propia DAL mediante cdigo ADO.NET, utilizando las tcnicas descritas arriba, Visual Studio proporciona una forma prctica de generar una DAL, basada en entradas a un asistente. La DAL es, en este caso, un objeto DataSet fuertemente tipado. El DataSet contiene tipos TableAdapter que muestran los mtodos para devolver objetos DataTable fuertemente tipados. Estos mtodos son apropiados para enlazar directamente a un ObjectDataSource, o para ser invocados desde los componentes de la capa de lgica de negocio.

Para aadir un DataSet a nuestro proyecto VisualStudio tenemos que hacer clic con el botn derecho en el "Solution Explorer" y seleccionar "Add New Item...", para despus elegir el tipo de elemento de proyecto "DataSet". Visual Studio nos preguntar si queremos aadirlo al directorio App_Code, a lo que contestaremos "Yes" para proceder. Visual Studio aade un fichero DataSet.xsd al directorio App_Code y abre el diseador de DataSet, lanzando por defecto el asistente de TableAdapter. Siguiendo los pasos de dicho asistente, podremos especificar las sentencias SQL o los procedimientos almacenados de nuestra base de datos y despus nombrar los mtodos asociados a estas consultas/comandos en la

pgina

final

del

asistente.

El TableAdapter puede mostrar dos tipos de mtodos: mtodos "Fill" (para rellenar los DataSet existentes) y mtodos "Get" (que devuelven un objeto DataTable ya relleno). El primero es ms adecuado para los clientes Windows (en los que el DataSet se mantiene en memoria durante el tiempo de vida de la aplicacin), mientras que los segundos lo son para ObjectDataSource. El asistente de TableAdaptes tambin puede generar automticamente los mtodods "Update",

"Insert" y "Delete" para nuestrar sentencias SQL (requiere que se seleccione la clave primaria). Despus de completar el asistente, Visual Studio aade un nuevo tipo DataTable y TableAdapter al diseados de DataSet.

Un TableAdapter representa el esquema de un resulset y las operaciones de Seleccin, Actualizacin y Borrado realizadas sobre el dicho esquema. Podemos aadir mltiples TableAdapters en un DataSet haciendo clic con el botn derecho en el diseador de DataSet. Tambin podemos aadir consultas adicionales, siempre que devuelvan el mismo esquema (campos) al TableAdapter, haciendo clic con el botn derecho en el cuadro TableAdapter del diseador. Por ejemplo, podramos tener un slo TableAdapter con los mtodos GetAuthors() y GetAuthorsById(int id), y necesitar un nuevo TableAdapter con el mtodo GetTitles(). La figura muestra el diseador de DataSet con varios TableAdapters

aadidos:

Una vez hemos finalizado el diseo del DataSet, tenemos que salvar el fichero DataSet.xsd (sto hace que el diseador compile los tipos y los hace accesibles desde nuestras pginas). Podremos ver que dichos tipos son accesibles desde nuestro cdigo: protected { void Page_Load(object sender, EventArgs e)

DataSetTableAdapters.PhotosTableAdapter DataSetTableAdapters.PhotosTableAdapter(); adapter.GetPhotosForAlbum(0); }

adapter

new

Sin embargo, no necesitamos llamar a estos mtodos directamente desde nuestro cdigo. En lugar de eso, podemos enlazarlos al ObjectDataSource: <asp:ObjectDataSource ID="ObjectDataSource1" runat="server"

TypeName="DataSetTableAdapters.PhotosTableAdapter" SelectMethod="GetPhotosForAlbum"> <SelectParameters> <asp:QueryStringParameter Type="Int32"/> </SelectParameters> </asp:ObjectDataSource> El siguiente ejemplo muestra un ObjectDataSource enlazado a los mtodos del DataSet.TableAdapter. Usaremos este DataSet en ms ejemplos de este tutorial para mostrar cmo podemos usar los controles de datos de ASP.NET para implementar una simple aplicacin de lbum de Fotos. Observar que DetailsView usa, en este ejemplo, un nuevo tipo de campo llamado --, para mostrar imgenes. Tambin hay que observar el uso de -- en el ObjectDataSOurce para hacer que los prametros "null" se conviertan en "DbNull" antes de pasarlos a los mtodos de TableAdaptes (obligatorio). C# Binding to a Visual Studio DataSet Name="albumID" QueryStringField="id"

Databinding en Plantillas Los controles de vinculado de datos "templated" nos dan una flexibilidad mxima en la presentacin de los datos en nuestras pginas. Podemos recordar varios controles "templated" de ASP.NET v1.x, como el DataList o el Repeater. Estos controles siguen siendo soportados en ASP.NET 2.0, aunque se ha simplificado y

mejorado la forma en la que enlazamos los controles dentro de las plantillas. Esta seccin muestra varias formas de vincular datos dentro de una plantilla de un control de vinculado de datos.

Templated data-bound controls give you ultimate flexibility over the rendering of data in your pages. You may recall several templated controls from ASP.NET v1.x, such as the DataList and Repeater controls. Those controls continue to be supported in ASP.NET 2.0, however the way that you data bind controls inside templates have been simplified and improved in this release. This section discusses the various ways to data bind inside a data-bound control template. Expresiones de Databinding ASP.NET 2.0 aade mejoras al enlazado de datos en plantillas, simplificando la sintaxis de enlazado de datos, pasando de DataBinder.Eval(Container.DataItem, fieldname), de v1.x, a Eval(fieldname). Cmo DataBinder.Eval, el mtodo Eval tambin accepta un parmetro formatString opcional. La sintaxis acortada de Eval es diferente de la de DataBinder.Eval en el hecho de que Eval resuelve automticamente el campo a travs de la propiedad DataItem del objeto contenedor ms cercano (DataListItem, en los ejemplos anteriores), mientras que DataBinder.Eval coge el argumento del contenedor. Es por sto que Eval slo se usa dentro de una plantilla de un control de enlazado de datos y no se puede usar en el nivel de Pgina. Por supuesto, DataBinder.Eval contina siendo soportado en ASP.NET 2.0, de forma que podemos utilizarlo en escenarios en los que la sintaxis simplificada de Eval no puede usarse. <asp:DataList <ItemTemplate> <asp:Image ImageUrl='<%# Eval("FileName", "images/thumbs/{0}") %>' runat="server"/> <asp:Label </asp:DataList> Text='<%# Eval("Caption") %>' runat="server"/> </ItemTemplate> DataSourceID="ObjectDataSource1" runat="server">

El ejemplo anterior muestra la nueva sintaxis simplificada de Eval de enlazado de datos para enlazar una imagen, un Label y un control HyperLink en una plantilla de un Item DataList. C# DataBinding en una Plantilla de DataList

El enlazado a datos tambin se puede incluir como parte de una definicin de un tema para un control, de forma que es posible alterar drsticamente el diseo y la apariencia de un control "templated" cambiando simplemente el tema que se le aplica. Sin embargo, slo Eval (o Bind, cmo se ha explicado antes) puede ser utilizado en una plantilla de Tema. Enlazar a cdigo arbitrario del usuario no est permitido. El siguiente ejemplo muestra un Tema aplicado al anterior ejemplo para crear una visin completamente diferente de la pgina de fotos. Para ms informacin sobre temas acudid a la seccin Aplicando Estilos, Temas i Skins de este tutorial. C# DataBinding en una Plantilla de DataList (Themed)

El Control FormView El control DataList itera sobre cada elemento de la fuente de datos y obtiene para cada elemento el "Item Template" (Plantilla de Elemento) una vez. sto es til para representar una lista de elementos, pero a veces lo que queremos es elnazar datos a un slo elemento de datos de un formulario. Para este propsito, ASP.NET 2.0 introduce el control FormView, que representa un slo elemento de datos cada vez en una plantilla independiente. La principal diferencia entre DetailsView y FormView es que el primero tiene incorporado una representacin tabular, mientras que FormVew requiere de la definicin de una plantilla por parte del usuario para su representacin. Por lo dems, ambos controles son muy similares. El siguiente ejemplo muestra un control FormView enlazado a un

OjectDataSource. La propiedad ItemTemplate de FormVIew contiene una imagen enlazada a datos, una etiqueta (Label) y un hiperenlace (HyperLink) como el anterior ejemplo de DataList. C# DataBinding en una Plantilla de FormView

De la misma manera que DetailsView, FormView mantiene el contacto con el elemento que se est representando y puede, opcionalmente, soportar paginacin en mltiples elementos de datos, cuando la fuente de datos devuelve una lista. El siguiente ejemplo muestra un FormView con paginacin permitida. C# DataBinding en una Plantilla de FormView (Paginada)

Enlazadao de Datos "Two-way" El FormView soporta Actualizaciones, Inserciones y Borrados automticos, a travs de sus controles de datos asociados, cmo lo haca el control DetailsView. Para definir la UI de entrada para la edicin o insercin, definiremos un EditItemTemplate o InsertItem, adems de la ItemTemplate. En este ejemplo, enlazaremos a los campos de la fuente de datos controles de entrada como TextBox, CheckBox o DropDownList. El enlazado a dato de estas plantillas utiliza, sin embargo, una sintaxis de enlazado a datos del tipo "two-way" , para permitir al FormView extraer de la plantilla los valores de los controles de entrada, para as poder pasarlos a la fuente de datos. Estos enlazados a datos utilizan la sintaxis Bind(fieldname) en lugar de Eval.

Importante: Un control que se enlaza a datos mediante Bind debe tener establecida la propiedad ID.

<asp:FormView DataKeyNames="PhotoID" <EditItemTemplate> <asp:TextBox runat="server"/> ID="CaptionTextBox"

DataSourceID="ObjectDataSource1" runat="server"> Text='<%# Bind("Caption") %>'

<asp:Button Text="Update" CommandName="Update" runat="server"/> <asp:Button Text="Cancel" CommandName="Cancel" runat="server"/> </EditItemTemplate> <ItemTemplate> <asp:Label <asp:Button Text='<%# Text="Edit" Eval("Caption") %>' runat="server" /> CommandName="Edit" runat="server"/>

</ItemTemplate> </asp:FormView> Cuando realizamos actualizaciones con GridView o DetailsView en las que hay BoundFields definidos para las columnas o campos para el control, GridView o DetailsView se responsabilizan de la creacin de la UI de entrada en los modos de Edicin o Insercin, de forma que puede extraer automticamente los valores de entrada y devolverlos a la fuente de datos. Debido a que las plantillas contienen controles de UI definidos por el usuario, es necesaria la sintaxis de enlazado a datos "two-way" para permitir que los controles "templated", como FormView, conozcan qu valores de control debers ser extraidos de la plantilla para su actualizacin, insecin o borrado. Podemos seguir usando la sintaxis de Eval en una EditItemTemplate para realizar vinculaciones a datos que no deberan ser devueltas a la fuente de datos. Observar tambin que FormView soporta la propiedad DataKeyNames de la misma forma que DetailsView y GridView, para mantener los valores originales de los campos clave primarios y devolverlos a las acualizaciones/borrados, incluso si dichos campos no se representan.

El FormView soporta la propiedad DefaultMode para especificar la plantilla a mostrar por defecto, pero por defecto el FormVIew empieza en modo ReadOnly y representa la ItemTemplata. Para permitir que la UI cambie del modo ReadOnly a los modos Edit o Insert podemos aadir un control Button a la plantilla y establecer

su propiedad CommandName a Edit o New. Desde la EditItemTemplate podermos aadir "Buttons" con el CommandName ya establecido a Update o Cancel para llevar a cabo o cancelar la operacin de actualizacin. De forma similar, podemos aadir "Buttons" con CommandName establecido a Insert o Cancel para llevar a cabo o cancelar la operacin de insercin.

El siguiente ejemplo muestra un FormView con ItemTemplate y EditItemTemplate ambas definidas. ItemTemplate contiene controles enlazados mediante Eval (oneway, un sentido)m mientras que EditItemTemplate contiene un control TextBox vinculado "two-way" (dos sentidos) mediante una sentencia Bind. El campo llave primario (PhotoID) es "round-tripped" en viewstate mediante la propiedad DataKeyNames. El FormView contiene botones de comando para cambiar entre las plantillas. C# Enlazado a Datos "Two-Way" (de Ida y Vuelta) en una Plantilla de Edicin de FormView

GriView y DetailsView tambin soportan una UI "templated" mediante el uso de un TemplateField aadido al grupo de Columnas o Campos (fields). TemplateField soporta ItemTemplate, EditItemTemplate y InsertItemTemplate (slo DetailsView) para especificar la UI del campo en los diferentes modos de dichos controles. De las misma forma que en el ejemplo anterior, los enlazados a datos "two-way" en EditItemTemplate o InsertItemTemplate permitirn a GridView o DetailsView extraer valores de los controles en estas plantillas. Un uso comn para TemplateField es aadir controles de validacin a la EditItemTemplate para la validacin declarativa de las operaciones GridView o DetailsView. El siguiente ejemplo muestra un ejemplo de esta tcnica. Para ms informacin sobre controles de validacin en ASP.NET, acudid a la seccin Validando Desde Controles de Entrada de este tutorial.

C#

Validacin

en

una

Plantilla

de

Edicin

de

GridView

Otro uso para TemplateField es personaizar los controles de entrada usados para introducir valores de los campos de GridView o DetailsView. Por ejemplo, podemos situar un DropDownList dentro de el EditItemTemplate o TemplateField para permitir la seleccin de una lista predefinida de valores. El siguiente ejemplo muestra esta tcnica. Observar que la DropDownList de este ejemplo est vinculada a datos a su propio control de fuente de datos para obtenes los valores de la lista de forma dinmica. C# DropDownList en una Plantilla de Edicin de GridView

Datos Jerrquicos Datos Jerrquicos Los controles de fuente de datos pueden mostrar datos tanto jerrquicos como "tabular", o ambos. Los controles SqlDataSource y ObjectDataSource que se han mostrado antes son ejemplos de controles de fuente de datos tabulares. ASP.NET 2.0 tambin incluye dos controles de fuente de datos jerrquicos: XmlDataSource para conectarnos a ficheros XML y SiteMapDataSource para conectarnos a datos de navegacin del site. Algunas tcnicas para el uso de estos controles se muestran en los ejemplos que se vern a continuacin. Los Controles TreeView y Menu De la misma forma que las fuentes de datos, los controles enlazados a datos tambin pueden ser jerrquicos. Mientras que un control tabular enlazado a datos representa una lista o una rejilla de datos, los controles jerrquicos enlazados a datos pueden moverse por una jerarqua de datos para representar los datos como relaciones padre-hijo en la UI. Dos ejemplos de controles enlazados a datos

jerrquicos son TreeView y Menu de ASP.NET 2.0. Las tcnicas para enlazar estos controles a fuentes de datos jerrquicas se muestran en los ejemplos de esta seccin.

Para ms ejemplos de estos Controles acudid a las secciones TreeView y Menu de la seccin de Referencia de Controles. Enlazando a XML El control XmlDataSource permite a los controles enlazar a datos XML. XmlDataSource tiene una propiedad DataFile para epecificar la ruta al fichero XML que se usar como entrada. Tambin especificaremos la propiedad TranformFile para aplicar una transformacin XSLT a los datos y la propiedad XPath para especificar un subconjunto de nodos que mostrar la fuente de datos. El siguiente ejemplo muestra un control TreeView enlazado a un fichero XML mediante el control XmlDataSource. El TreeView asocia las propiedades de los objetos TreeNode individuales a los atributos de los nodos XML de la jerarquia (los atributos se "promocionan" a propiedades del objeto de datos por el bien del enlazado de datos). Por defecto, el control TreeView slo representa los objetos de datos llamando a ToString() en el objeto. sto representa el nombre del elemento de nodo XML de forma que podemos ver la jerarqua de nodos a la que el TreeView est vinculado. sto no tiene que producir necesriamente la representacin deseada, pero nos da un punto de partida para ir personalizando la forma en que se representarn los datos. C# Enlazando un TreeView a un Fichero XML

Para darle al TreeView una representacin con mayor significado, podemos especificar enlazados de datos individuales para los nodos del rbol. Deberamos

aadir los objetos TreeNodeBinding a la coleccin de "Databindings" del TreeView para definir cmo se mapean los campos de datos jerrquicos a las propiedades TreeNode. Hay dos propiedades clave de TreeNodeBinding que determinan el conjunto de elementos de datos jerrquicos a los que se aplica el enlazado. La propiedad DataMember especifica el tipo de elementos de datos o, en el caso de datos XML, el nombre del elemento al que se aplica el enlazado. La propiedad Depth especifica la profundidad dentro de los datos jerrquicos a la que se aplicar el enlazado de datos. Podemos establecer DataMember o Depth, o ambas. Por ejemplo, para definir los enlaces a datos para todos los elementos Book de un fichero XML, estableceremos DataMember a "Book". Para definir enlaces para todos los nodos a una profundidad 1, estableceremos la propiedad Depth a 1. Para definir enlazados para todos los nodos Book que se encuentren a una profundidad 1, estableceremos DataMember a "Book" y Depth a 1, en el objeto TreeNodeBinding.

Una vez que hemos establecido DataMember o Depth para obtener un nmero concreto de nodos, podemos definir propiedades adicionales de -- para definir la forma de mapear las propiedades del elemento de datos (o atributos del nodo XML, en el caso de datos XML) en propiedades de los TreeNodes que representa el control TreeView. Por ejemplo, la propiedad TextField define el nombre de la propiedad/atributo que usar el "Text" del TreeNode. De forma similar, la propiedad ValuField define la propiedad/atributo del elemento de datos para el "Value" del TreeNode. La propiedad NavigateUrlField define el campo/atributo a usar por el NavigateUrldel TreeNode, y as sucesivamente. Podemos especificar tambin valores estticos para las propiedades de TreeNode para un determinado enlazado a datos. Por ejemplo, para especificar que los TreeNodes de los elementos Book tienen una imagen "Book.gif", tendremos que establecer la propiedad ImageUrl del TreeNodeBinding cuyo DataMember est establecido a "Book". El siguiente ejemplo muestra un TreeView enlazada a los mismos datos XML del

ejemplo anterios, con Databindings definidos para elementos especficos de la jerarqua XML. C# Enlazados a Datos de TreeView

El XmlDataSource soporta una propiedad XPath que podemos usar para filtrar el conjunto de nodos mostrados por la fuente de datos. En el siguiente ejemplo, la propiedad XPath se fija a Bookstore/genre[@name='Business']/book, para filtrar los nodos de la fuente de datos y mostrar slo aquellos elementos "book" del gnero "Business". Hay que ir concuidado con especificar la sintaxis correcta para la propiedad XPath, porque si no lo hacemos la fuente de datos no mostrar ningn nodo (y el control de enlazado de datos no los representar) C# Resultados de un TreeView en un XPath

Observar que la jerarqua de TreeView concuerda del todo con la de la fuente XML. Debido a esto, se suele contruir ficheros XML para venlazarlos al TreeView o para usar una transformacin XSL para re-estructurar los datos en una jerarqua ms apropiada para el enlazado del TreeView. C# TreeView de una Transformacin XSLT

Tambin es posible enlazar un control tabular enlazado a datos a una fuente de datos jerrquica, aunque el control slo representar el primer nivel de la jerarqua. En el siguiente ejemplo, un control DataList "templated" se enlaza al mismo fichero XML de los ejemplos anteriores. Debido a que los nodos de nivel

superior mostrados por la fuente de datos son nodos <book/>, el DataList podr enlazar a las propiedades de estos nodos en sus ItemTemplate, mediante expresiones de enlazado de datos Eval. It is also possible to bind a tabular data-bound control to a hierarchical data source, however the control only renders the first level of hierarchy in this case. In the example below, a templated DataList control is bound to the same bookstore XML file from the preceding example. Because the top-level nodes exposed from the data source are <book/> nodes, the DataList can bind to properties of those nodes in its ItemTemplate using Eval data binding expressions. C# DataList Enlazado a un Fichero XML

A pesar que representar un nivel de la jerarqua puede ser til, sera mejor si pudiramos anidar controles tabulares vinculados a datos para reflejar la jerarqua subyacente. Afortunadamente, ASP.NET 2.0 nos permite hacer justamente sto. Adems de la sintaxis de enlazado de datos de Eval, ASP.NET 2.0 nos proporciona una sintaxis de vinculado de datos basada en XPath soportada por cualquier elemento de datos que implemente la interfaz IXPathNavigable. Hay dos tipos de expresiones soportadas:

XPath(expression, [formatString]) - Evaluates an XPath expression against the data item, returning a single value. XPathSelect(expression, [formatString]) - Evaluates an XPath expression against the data item, returning a selected list of nodes.

El siguiente ejemplo se construye sobre el anterior, utilizando las expresiones de enlazado a datos XPath en lugar de las de Eval para enlazar los atributos de los nodos book. A primera vista parece que no haga nada ms que introducir el prefijo '@' a las expresiones, que es la sintaxis XPath para hacer referencia a un atributo nodo. Sin embargo, la flexibilidad real de XPath radica en su habilidad para hacer

referencia a elementos arbitrarios dentro de la jerarqua (no slo atributos). El ejemplo aade otro DataList al ItemTemplate del DataList ms exterior y enlaza la propiedad -- de este DataList interno a una expresin -- que representa la lista de nodos de captulos del nodo "book" actual. En el ItemTemplate del DataList interno, las expresiones XPath de enlazado de datos se evalan contreo los nodos de contexto de este "captulo". Mediante esta tcnica, ASP.NET 2.0 nos permite construir fcilmente representaciones de datos jerrquicas y "ricas" mediante controles tabulares. C# DataList Anidados Enlazados a un Fichero XML

Un control de fuente de datos jerrquica como XmlDataSource asocia una nica ruta a cada nodo de su jerarqua, para servir las peticiones de los controles enlazados a datos para nodos de una localizacin especfica. sto permite caractersticas como la de PopoulateOnDemand del TreeView, dnde los nodos de la fuente de datos se pueden enviar al cliente cuando se expande cada nodo, en lugar de enviarlos todos de una (esta caracterstica se discute de forma ms detallada en los ejemplos de la referencia del control TreeView). Eso tambin nos permite usar esta ruta desde la pgina de cdigo para configurar la fuente de datos para mostrar los nodos desde una ubicacin especfica. La sintaxis de la ruta es especfica del tipo de datos representados y no se puede construir mediante cdigo. Sin embargo, podermos acceder a la ruta de datos de un nodo enlazado al TreeView mediante la propiedad DataPath del TreeNode. Debido a que XmlDataSource XmlDataSource utiliza expresiones XPath para su sintaxis de la ruta de datos, estas rutas podran asignarse a la propiedad XPath de un XmlDataSource para filtrar la lista de nodos. El siguiente ejemplo muestra esta tcnica para implementar un escenario "master-details" utilizando XmlDataSource. Hay dos controles XmlDataSource, uno vilculado al TreeView (master control) y otro al DataList (details control). Cuando se hace clic sobre un nodo Treeview, se

recupera la propiedad DataPath y se asigna al control XmlDataSource enlazado al DataList, para mostrar informacin adicional del nodo sobre el que se ha hecho clic. C# Registro de Eventos basado en XML utilizando TreeView(Master-Details)

La seccin de Referencia del control TreeView sigue un conjunto de pasos que muestran cmo se escribi este ejemplo partiendo de cero, as que si queris ms informacin, . Enlazando a la Navegacin del Sitio La navegacin del sitio es otra forma de datos jerrquicos en las aplicaciones ASP.NET. sto se describe en la seccin Creando una Jerarqua de Navegacin del Sitio. Adems de soportar la API de Navegacin por el Sitio de ASP.NET para acceder de forma programada a los datos del mapa del sitio, ASP.NET 2.0 tambin soporta un control SiteMapDataSource para enlazar datos de forma declarativa. Cuando enlazamos un control TreeView (o Menu) a un SiteMapDataSource, la propiedades Text y Url del mapa del sitio se pueden enlazar a TreeNodes (o MenuItems). A pesar de que podemos especificar un conjunto de "Databindings" para establecer estos enlaces, esto no es estrictamente necesario. Los controles TreeView y Menu enlazan automticamente las propiedades Text y NavigateUrl del TreeNode o el MenuItem a las propiedades del mapa del sitio en cuestin (sto se consigue mediante la interfaz INavigateUIData o SiteMapNode). Otra caracterstica de TreeView y Menu cuando se enlazan a SiteMapDataSource es que se establecen automticamente las propiedades SelectedNode o SelectedItem al nodo actual dentro El siguiente del ejemplo muestra mapa un TreeView del enlazado a un sitio. control acudid a dicha seccin.

SiteMapDataSource. A

pesar que

este ejemplo muestra un

grupo de

"Databindings" por propositos demostrativos, sto no es necesario cuando slo estamos enlazando a las propiedades Text y Url del nodo. C# TreeView Enlazado a Datos del SiteMap

Enlazando a Bases de Datos Relacionales Una base de datos relacional tambin se puede interpretar como una jerarqua cuando las tablas se asocian mediante relaciones de claves externas. Por ejemplo, una base de datos de productos en la que cada producto se asocia con una categora de productos se puede interpretar como una relacin jerrquica (1 a muchos) entre categoras de productos. A pesar que la versin actual de ASP.NET no incluye un control de fuente de datos para mostrar los datos relacionales como jerrquicos, podemos conseguir sto llenando de forma programada los nodos/elementos de un control enlazado a datos jerrquicos como TreeView o Menu. El siguiente ejemplo muestra un control TreeView llenado desde una base de datos relacional. Este ejemplo aprovecha la caracterstica PopulateOnDemand de TreeView para llenar los nodos hijos "on-demand" (a travs de una llamada al servidor) cuando se expande un TreeNode en el cliente. Para ms informacin sobre esta caracterstica, acudir a la seccin referencia del control TreeView de este tutorial. C# Llenando el TreeView desde una Base de Datos

Escenarios de Datos Avanzados Este apartado nos muestra cmo podemos usar algunas de las caractersticas menos obvias de los controles de datos para implementar escenarios.

Manejando Valores Nulos Los controles de datos soportan varios tipos de formas para tratar los datos nulos o inexistentes. Para empezar, GridView, FormView y DetailsView soportan las propiedades EmptyDataText o EmptyDataTemplate, que podemos usar para especificar una representaxin para el control cuando la fuente de datos no devuelve ninguna fila de datos. Basta con fijar EmptyDataText o EmptyDataTemplate (EmptyDataTemplate predomina cuando se establecen ambos). Tambin podemos especificar la propiedad ConvertEmptyStringToNull en BounFienld (y cualquier tipo derivado), en TemplateField o en objetos de parmetros de fuente de datos, para especificar dicha cadena. Los valores vacos enviados desde el cliente deben convertirse a nulls antes de invocar la operacin de la fuente de datos ascociada. ObjectDataSource tambin soporta la propiedad ConvertNullToDbNull que se puede establecer a "true" cuando el mtodo asociado espera parmetros "DbNull" en lugar de "null" (las clases TableAdapter del DataSet de VisualStudio tienen este requerimiento).Tambin podemos especificar la propiedad NullDisplayText en BoundField (y los tipos de campos derivados) para especificar un valor para el campo a mostrar cuando el campo "value" de la fuente de datos se devuelve como nulo. Si este valor no se cambia en el modo de edicin, el valor se enviar de vuelte como "null" a la fuente de datos durante la operacin de actualizacin. Por ltimo, tambin podemos especificar la propiedad DefaultValue en los parmetros de la fuente de datos para especificar un valor por defecto para el parmetro cuando el valor pasado para l en nulo. Estas propiedades pueden encadenarse, por ejemplo, si se establece tanto ConvertEmptyStringToNull como DefaultValue, el valor String.Empty se convertir primero a "null" y despus al valor por defecto. C# Trantanto con Valores Nulos

Podemos utilizar estas propiedades para manejar valores nulos para implementar

un filtro para una DropDownList que inicialmente muestre todos los valores de la fuente de datos hasta que se seleccione un valor de filtrado. sto se consigue aadiendo un elemento a la DropDownList con un valor de cadena vaco y seleccionando la propiedad ConvertEmptyStringToNull en el ControlParameter asociado a la DropDownList en la fuente de datos. Despus en el SelectCommand de la fuente de datos podremos buscar el valor nulo para devolver todos los valores (no filtrados). El siguiente ejemplo muestra esta tcnica usando un sencillo comando SQL, aunque tambin podramos buscar el valor nulo en la implementacin de un procedimiento almacenado. Observad el uso de la propiedad AppendDataBoundItems del DropDownList, que permite agregar los valores obtenidos de la fuente de datos de la DropDownList al elemento "ALL", aadido estticamente en el grupo de Items. Observad tambin que por defecto el SqlDataSource no realiza una operacin de Select si alguno de los parmetros asociados al SelectCommand son nulos. Para permitir que la operacin de "select" se ejecute an cuando se le pase algn parmetro nulo, podemos establecer la propiedad CancelSelectOnNullParameter a false. C# Mostrar Todos los Valores en una Seleccin Nula

"Master Details" Avanzados En los anteriores captulos de este tutorial hemos visto como se puede implementar un escenario de "master-details" asociando un ControlParameter a la propiedad SelectedValue del GridView. La propiedad SelectedValue devuelve el valor del primer campo especificado por la propiedad DataKeyNames. Tambin podemos especificar mltiples valores de un campo, separndolos por comas, para la propiedad DataKeyNames, por ejemplo si necesitamos pasar ms de un campo a la fuente de datos de detalles (Details) en un escenario master-details. Los valores de estos campos clave adicionales son accesibles a travs de la propiedad SelectedDataKey, que devuelve un objeto DataKey de duplas nombre/valor para los campos clave. Un ControlParameter puede hacer referencia

a estas claves estableciendo la propiedad PropertyName a una expresin, como SelectedDataKey.Values("title_id"). <asp:ControlParameter <asp:ControlParameter Name="FirstKey" Name="SecondKey" ControlID="MasterGrid" ControlID="MasterGrid"

PropertyName="SelectedDataKey.Values[0]"/> PropertyName="SelectedDataKey.Values[1]"/> El siguiente ejemplo muestra el cdigo para enumerar el grupo de DataKeys y obtener los valores de los campos claves del SelectDataKey del GridView. C# DataKeys

Los anteriores ejemplos de master-details de este tutorial nos mostraban el control "details" como un control separado del formulario, pero otra forma comn de implementacin de "master-details" es mostrando el control details como un control anidado que es parte de la representacin del control "master". Para sto, necesitamos que ambos controles, el "details" y su fuente de datos asociada estn contenidos en una plantilla del control "master", con un parmetro de la fuente de datos que obtiene su valor de un campo de la fuente de datos del "master". Debido a que no hay un objeto de parmetro declarativo que se pueda asociar de esta manera, tendremos que estableces el valor programndolo en cdigo. Podermos hacer esto manejando un evento en el control "master" para establecer el valor del parmetro cuando un elemento del control "master" est enlazado a datos, por ejemplo en el evento DataBound del FormView. El siguiente ejemplo muestra esta tcnica. C# Master-Details Anidados

El siguiente ejemplo nos muestra una tcnica similar usando DataList, manejando el evento ItemDataBound de DataList para establecer los detalles del valor del parmetro de la fuente de datos. C# Master-Details Anidados (DataList)

Manejando Eventos de Controles de Datos Ya hemos visto varios ejemplos de eventos de controles de datos en las anteriores secciones del tutorial. En teora, los eventos de controles de datos nos proporcionan los lugares en los que podemos insertar nuestro propio cdigo, en el ciclo de vida de la pgina. Los controles de datos dan acceso a eventos tanto antes como despus de que se produzca una operacin. Los eventos que se ejecutan antes de una operacin se suelen nombrar con el sufijo -ing, mientras que los que se dan despus de la operacin se nombran con el sufijo -ed. Los eventos que soporta el GridView incluyen, por ejemplo:

PageIndexChanging y PageIndexChanged - Despus de una operacin de paginacin SelectedIndexChanging y SelectedIndexChanged - Antes y despus de que se produzca una seleccin Sorting y Sorted - Antes y despus de una operacin de clasificacin RowEditing y RowCancelingEdit - Antes de que una fila se ponga en modo edicin o antes de la cancelacin del modo de edicin. RowUpdating y RowUpdated - Antes y despus de una operacin de actualizacin RowDeleting y RowDeleted - Antes y despus de una operacin de borrado RowDataBound - Cuando una fila es enlazada a datos

RowCreated - Cuando una fila se crea para representacin (como una TableRow) RowCommand - Cuando se "lanza" un comando "button" desde el control

Los controles de la fuente de datos tambin hacen accesibles eventos, similares a los eventos de controles vinculados a datos. Tanto el SqlDataSource como el ObjectDataSource soportan los siguientes eventos:

Selecting y Selected - Antes y despus de una operacin de seleccin Updating y Updated - Antes y despus de una operacin de actualizacin Deleting y Deleted - Antes y despus de una operacin de borrado Inserting y Inserted - Antes y despus de una operacin de insercin Filtering - Antes de una operacin de filtrado

El control ObjectDataSource tambin da acceso a eventos cuando el objeto que especificamos en la propiedad TypeName es creado o destruido. En realidad podemos fijar un objeto personalizado en el evento ObjectCreating estableciendo la propiedad ObjectInstance de los argumentos del evento que hemos pasado.

ObjectCreating y ObjectCreated - Antes y despus de la creacin del objeto ObjectDisposing - Antes de que se elimine el objeto

Normalmente los eventos que se lanzan antes de que se produzaca una operacin se utilizan para cancelar la operacin, estableciendo la propiedad Cancel de los eventos a true, o para realizar una validacin o manipulacin de los parmetros. Los eventos que se lanzan despus de una operacin se usan para escribir cdigo personalizado en respuesta a cierta operacin, o para comprobar el xito de la operacin. Por ejemplo, podemos comprobar el RowsAffected producido por una operacin de Actualizacin, Insercin o Borrado o comprobar la propiedad Exception para determinar si se ha producido una excepcin durante el procesado. Tambin podemos establecer la propiedad ExceptionHandled del evento args para prevenis que la excepcin se pase a la pgina de control. El

siguiente ejemplo muestra los diferentes eventos de GridView y SqlDataSource que se pueden manejar y el orden relativo en el que se crean. C# El Evento RowUpdating de GridView

A continuacin, se muestra un manejo ms prctico del evento Inserting de DetailView para la obtencin de una foto enviada desde un control FileUpload, de dentro del DetailsView, para guardar los contenidos al disco antes de que el DetailsView complete la operacin de insecin del registro correspondiente dicha fotografa en la base de datos. Por motivos demostrativos, el verdadero cdigo de guardado se ha descomentado, pero se puede seguir probando este ejemplo especificando el nombre de la imagen ya existente "Winter.jpg". C# El Evento ItemInserting de DetailsView

De forma similar al ejemplo anterior, este ejemplo muestra el manejo del evento -del FormView para eliminar el ficher fotogrfico asociado del disco, cuando se elimina el registro de dicha fotografa de la base de datos. De nuevo, se ha descomentado el verdadero cdigo por motivos demostrativos. C# El Evento ItemDeleted de FormView

Trabajando Con Parmetros Podemos manejar los eventos de la operaciones Select, Update, Insert, Delete y Filter para validar y menipular los valores de los parmetros que se pasan a dichas operaciones. Tanto los controles enlazados a datos como los controles de la fuente de datos nos dan acceso a los eventos apropiados para estos propsitos. Por ejemplo, en el evento de Actualizacin del GridView, podemos ver los nombres y valores de los parmetros en los diccionarios de "keys", "NewValues" y "OldValues" que se envan a la fuente de datos. En el lado de la fuente de datos podemos manejar el evento "Updating" de SqlDataSource para ver estos parmetros como se aplican al objeto de comandos subyacente, que se ejecutar para completar la operacin.De forma similar podemos manejar un evento "Updating" de SqlDataSource para ver o cambiar los diccionario de parmetros que se usarn para resolver la sobrecarga apropiada del UpdateMethod. Podemos usar estos eventos para aadir o eliminar parmetros de los diccionarios o comandos, cambiar sus valores o simplemente validar que los parmetros tengan un formato correcto.

Importante: Deberamos validar especiamente los parmetros de entrada para el evento Filtering, el cual no obtiene SQL codificado antes de aplicarlo a la FilterExpression asociada al objeto DataView.

El siguiente ejemplo muestra como tratar varios eventos de controles de datos para enumerar los grupos de parmetros pasados a travs del evento args. Observad que este ejemplo fija a falso la propiedad InsertVisible del BoundField asociado a la campo OrderID de la clave primaria, porque el campo OrderID es una entidad columna en la base de datos subyacente y no debe pasarse a las operaciones de Insercin (la base de datos incrementa su valor automticamente cuando se produce una insercin). Adems hay que observar que el campo OrderID se marca como la clave primaria en DataKeyNames, de forma que el valor original de este campo se retiene en el diccionario de Keys (claves) que pasado por el control enlazado a datos. Los valores introducidos por el usuario a los controles de entrada se pasan en un diccionario de NewValues, a excepcin

de aquellos campos marcados como ReadOnly=false. Los valores originales para los campos no-claves tambin son retienen en un diccionario de OldValues por parte de los controles enlazados a datos para pasarlos a la fuente de datos. Estos valores de parmetros son aadidos al comando por el SqlDataSource en siguiente orden: NewValues, Keys, OldValues. Sin embargo, la fuente de datos no aade OldValues cuando en ConflictDetection se establece OverwriteChanges. Para ms informacin de la utilizacin de OldValues por parte de la fuente de datos, acudid a la seccin Utilizando Deteccin de Conflictos.

C#

Parmetros

de

Datos

Podemos cambiar el orden en el que SqlDataSource agrega los parmetros al comando, aadiendo objetos Parameter estticos al grupo de parmetros para una operacin de la fuente de datos, en el orden que queramos. SqlDataSource reordena de forma automtica los parmetros pasados en el control enlazado a datos de acuerdo al orden de los objetos Parameter. sto es til cuando la propiedad ProviderName de la fuente de datos se establece a System.Data.OleDb, el cual no tiene soporte para los parmetros "nombrados" (named), de forma que el orden en el que se agregan los parmetros al comando debe coincidir con el de los parmetros de substitucin annimos ('?') en el comando. Cuando usamos parmetros "nombrados" (named), el orden de los parmetros es irrelevante. Podemos especificar la propiedad Type de un objeto Parameter para forzar que los valores que pasa el control enlazado a datos se conviertan al tipo de datos apropiado antes de ejecutar el comando o mtodo. Asimismo, podemos establecer la propiedad Size de un Parameter para imponer el tamao (Size) de el DbParameter en un comando SqlDataSource (requerido para entrada/salida, salida y devolver parmetros de valores).

C#

Tipos

Orden

de

Parmetros

La convencin por defecto para los nombres de los parmetros requiere que los nuevos parmetros se nombren de acuerdo con los campos seleccionados por la operacin Select de la fuente de datos. Es posible renombrar los parmetros de Keys o OldValues para diferenciarlos de NewValues, especificando la propiedad OldValuesParameterFormatString, por ejemplo a "original_{0}". Tambin podemos personalizar los nombres de los parmetros manejando un evento apropiado para cambiar el valor de un parmetro antes de que se ejecute una operacin de la fuente de datos. Por ejemplo, si la operacin de actualizacin de un SqlDataSource se asocia a un procedimiento almacenado que coge nombres de parmetros diferentes a aquellos que coinciden con la convencin por defecto, podremos modificar los nombres de los parmetros en el evento Updating del SqlDataSource antes de llamar al procedimiento almacenado. El siguiente ejemplo nos muestra esta tcnica. C# Renombrando Parmetros

ObjectDataSource no depende de un orden particular de los parmetros, pero en lugar de eso busca un mtodo que concuerde con los nombres de los parmetros. Observad que ObjectDataSource no usa el Tipo o el Tamao de un parmetro para resolver la sobrecarga de mtodos. Slo se comprueban los nombres de los parmetros, de forma que si tenemos dos mtodos en el objeto de negocio que tienen los mismos nombres de parmetros, aunque sean de tipos diferentes, ObjectDataSource no podr distinguirlos. Podemos cambiar los nombres y valores de los prametros de ObjectDataSource en eventos, de forma parecida al anterior

ejemplo. Sin embargo, si usamos DataObjectTypeName para especificar un objeto de datos particular para pasarlo a las operaciones de Actualizacin, Insercin y Borrado, no podremos modificar los nombres de los parmetros, slo los valores. Si necesitamos modificar los nombres de los parmetros, no usaremos DataObjectTypeName y, en su lugar, contruiremos manualmente, mediante cdigo, los objetos de datos apropiados en los eventos de la fuente de datos. Todos los parmetros de la fuente de datos que hemos estado utilizando tiene parmetros Input (de entrada), que se usan para pasar valores en una operacin de la fuente de datos. Los parmetros tambin pueden ser bidireccionales, como InputOutput, Output y ReturnValue. Podemos especificar la direccin de un parmetro mediante la propiedad Direction del objeto. Para recuperar los valores de dichos parmetros cuando se acabe la operacin de la fuente de datos, se maneja el evento de "post-operacin" adecuado (por ejemplo Selected, Updated, Inserted o Deleted) para obtener el valor del parmetro desde los argumentos del evento que hemos pasado a los eventos. El SqlDataSourceStatusEventArgs tiene una propiedad Command, qu podemos usar para obtener los valores devueltos y los prmetros de salida, cmo veremos en el siguiente ejemplo. Observad que es importante fijar la propiedad Size del objeto Parameter en el SqlDataSource para que los parmetros bidireccionales tenga un valor apropiado. C# Devolver Valores y Parmetros de Salida

El

tipo

ObjectDataSourceStatusEventArgs

soporta

un

grupo

de

OutputParameters y devuelve la propiedad ReturnValue para este propsito, como veremos en el siguiente ejemplo. Observad que, en este caso, el valor devuelto por la operacin Update se usa para determinar el nmero de filas afectadas por dicha operacin. Para devolver este valor al control enlazado a datos (por ejemplo a travs de la propiedad GridViewUpdatedEventArgs

AffectedRows

podemos

establecer

la

propiedad

AffectedRows

del

ObjectDataSourceStatusEventArgs a este valor de vuelta). C# Devolver Valores y Parmetros de Salida (objeto)

Otro uso comn de los parmetros de salida es obtener el valor de la clave primaria de una fila insertada en una base de datos qu es una columna Identify (en la que el valor clave no se especifica como un parmetro de insert, sin que es generado automticamente por el servidor de la base de datos cuando se produce una insercin). Este ejemplo muestra esta tcnica. C# Obteniendo la Identidad Despus de una Insercin

Utilizando Deteccin de Conflictos Cmo hemos dicho en anteriores secciones, el control enlazado a datos pasa valores a la fuente de datos en diccionarios de "Keys", "Values" (nuevos valores) y "OldValues" diferentes. Por defecto SqlDataSource y ObjectDataSource ignoran el diccionario de OldValues y, en su lugar, slo aplican los de Keys y Values. Este comportamiento viene determinado por la propiedad ConflictDetection de la fuente de datos, que est fijada a OverwriteChanges por defecto. El modo OverwriteChanges consiste bsicamente en que "slo encontrar los valores de la claves primarias con el propsito de actualizar o eliminar un registro". Este comportamiento significa que el registro se actualiza o se elimina a pesar de si los valores subyacentes de dicho registro han cambiado. A menudo, es ms deseable permitir la actualizacin o borrado cuando los valores de la fila coinciden exactamente con lo que se haba seleccionado inicialmente. De esta forma, si otro usuario actualiza la fila mientras se selecciona la dila y se acualiza, nuestra operacin de actualizacin fallar. Las fuentes de datos soportan sto fijando la

propiedad ConflictDetection a CompareAllValues. De esta forma, la fuente de datos aplica los parmetros OldValues al comando o mtodo, qu los puede usar para asegurar que en las operaciones de actualizacin o borrado coinciden todos los valores del registro antes realizar las operaciones. Tambin tendremos que establecer la propiedad OldValuesParameterFormatString a un formato de cadena del Framework .NET vlido, por ejemplo "original_{0}", para indicar cmo se deberan renombrar los parmetros de los diccionarios de OldValues y Keys y poder diferenciarlos de los NewValues.

El siguiente cdigo muestra los comandos SQL tpicos para los modos OverwriteChanges y CompareAllValues del control SqlDataSource. El campo ID es la clave primaria. Observad que los comandos posteriores comparan los valores originarles de la fila en la clasula WHERE, no en la clave primaria. En este caso, OldValuesParameterFormatString necesitara establecerse a "original_{0}" en la fuente de datos. SELECT -WHERE DELETE -WHERE [ID] = FROM [ID] [Contacts] WHERE = [ID] = [ID], [Name], [Address] from [Contacts]

OverwriteChanges @ID @ID

UPDATE [Contacts] SET [Name] = @Name, [Address] = @Address

CompareAllValues @original_ID

UPDATE [Contacts] SET [Name] = @Name, [Address] = @Address AND [Name] = @original_Name AND [Address] = @original_Address DELETE FROM [Contacts] WHERE [ID] = @original_ID AND [Name] = @original_Name AND [Address] = @original_Address El siguiente ejemplo muestra las enumeraciones de parmetros en el nivel de los controles enlazados a datos y el de la fuente de datos, para los diccionarios de Keys, Values y OldValues, cuando ConflictDetection se establece a

CompareAllValues. Por motivos demostrativos, las operaciones reales de Actualizacin, Borrado e Insercin se han cancelado. Observad tambin que no se requieren los OldValues para la operacin de Insercin. ConflictDetection slo tiene sentido para actualizaciones y Borrados. C# Parmetros de Deteccin de Conflictos

El siguiente ejemplo muestra el comportamiento cuando se produce un conflicto. Para ejecutar este ejemplo, abrid dos instancias del ejemplo en ventanas diferentes del navegados (hacer clic en "Run It" dos veces). Despus haced clic en el botn "Edit" para la misma fila en ambas ventanas, para que la fila se ponga en modo de edicin. En la primera ventanacambiad un valor de la fila y haced clic en "Update", y observad como la actualizacin es exitosa. En la segunda ventana podis entrar un nuevo valor para la misma fila y hacer clic en "update", pero la actualizacin no se producir porque los valores de la fila se haban cambiado en la primera operacin de actualizacin. El ejemplo comprueba que la propiedad AffectedRows del evento Updated o Deleted es 0 para confirmar que se ha producido un conflicto. C# Deteccin de Conflictos (Update y Delete)

Cuando usamos UI basadas en plantillas para las actualizaciones o borrados, los valores antiguos se guardan en campos enlazados a datos en dos sentidos mediante sentencias Bind. Para los borrados, sto significa que tendremos que usar sentencias Bind para enlazar a datos los valores en el ItemTemplate para

guardar los antiguos valores para las operaciones de borrado. El siguiente ejemplo miestra esta tcnica. C# Deteccin de Conflictos Mediante Plantillas

Podemos manejar los erros en la deteccin de conflictos con elegancia dando al usuario la opcin de realizar o abortar la operacin cundo la fila en implicada ha cambiado, mostrando los valores cambiados al usuario de forma que los pueda comparar con los de su actualizacin. El siguiente ejemplo muestra una posible aproximacin al manejo de errores de la deteccin de errores. Observad que el evento RowUpdated del DetailsView pasa diccionarios que podemor utilizar para comprobar los valores introducidos por el usario. Tambin podemos establecer la propiedad KeepInEditMode de este evento para mantener el DetailsView en modo de edicin mientras que el usuari toma una decisin sobre cmo tratar el conflicto. Podis ejercitar este ejemplo de la misma forma que el anterios, abriendo dos ventanas para crear un conflicto de actualizaciones. C# Manejando Actualizaciones Conflictivas

El siguiente ejemplo muestro el mismo escenario utilizando ObjectDataSource. Observad que debido a que la propiedad ConflictDetection de la fuente de datos est establecida a CompareAllValues, la fuente de datos busca una sobrecarga de UpdateContact que accepte los valores originales para cada campo del objeto Contact.

C#

Deteccin

de

Conflictos

w/ObjectDataSource

Tambin podemos usar la propiedad DataObjectTypeName conjuntamente con CompareAllValues. En este caso, ObjectDataSource busca una sobrecarga de UpdateContact que aceta exactamente dos parmetros, ambos del tipo Contact. El primet parmetro ser un objeto Contact que contendr los nuevos valores para la actualizacin, mientras que el segundo ser un objeto Contact con los valores originales. C# Deteccin de Conflictos w/ObjectDataSource

(DataObjectTypeName)

Paginacin/Clasificacin Avanzada La seleccin en el control GridView es un concepto puramente de UI, dnde la propiedad SelectedIndex corresponfe al ndice de la fila seleccionada actualmente entre las filas visibles de la rejilla. Si permitimos la paginacin y clasificacin en la rejilla, el SelectedIndex de la rejilla se mantiene despus de las operaciones de paginacin o clasificacin, de forma que una nueva fila se seleccionar despus de dichas operaciones. En algunas circunstancias es mejor mantener la seleccin de una determinada fila incluso cuando esa fila no est visible en la actual pgina de la rejilla. El siguiente ejemplo muestra una tcnica para mantener la fila seleccionada despus de las operaciones de clasificacin o paginacin.

C#

Maintaniendo

la

Seleccin

Despus

de

la

Clasificacin

GridView y DetailsView soportan un modo especial para paginar y clasificar que aprovecha las llamadas del lado del cliente hacia el servidor para obtenes los datos para la nueva pgina o los datos clasificados recientemente. Para poder usar esta funcionalidad, tenemos que establecer la propiedad EnableSortingAndPagingCallbacks a true. Observad que cuando se realiza una operacin de paginacin o clasificacin, la pgina no necesita enviar de vuelta para conseguir los nuevos valores (aunque se cree un script de callback hacia el servidor). Esta caracterstica no est soportada cuando GridView o DetailsView contienen campos que siguen una plantilla. Tambin se puede mostrar el botn en un CommandField cuando se permite esta caracterstica. C# Clasificar y Paginar Mediante Callbacks

Aunque GridView, DetailsView y FormView proporcionan una representacin por defecto para la UI de paginacin, tambin podemos personalizar la representacin del paginador estableciendo la propiedad PagerTemplate. Dentro de esta plantilla podemos colocar controles Button con la propiedad CommandName fijada a Page, y la propiedad CommandArgument fijada a First, Prev, Next, Last o <number>, dnde <number> es un valor de un ndice de pgina especfico . Es siguiente ejemplo muestra un PagerTemplate definido tanto para el control GridView como para ed control DetailsView.

C#

Plantilla

de

Paginador

Enlazando a Datos en Cdigo Cmo se dijo en la seccin Datos en Plantillas, ASP.NET incluye una sintaxis declarativa de enlazado a datos para asociar los campos de la fuente de datos con las propiedades de los controles de una plantilla de enlazado a datos. Tambin podemos usar la sintaxis <%# ... > para enlazar a datos valores arbitrarios en el cdigo, como las propiedades Page y control, grupos, expresiones e, incluso, resultados devueltos por las llamadas a mtodos. Para forzar el enlazado a datos a ser evaluado, tendremos que llamar al mtodo DataBind en la pgina o control que contiene las expresiones de enlazado a datos. La siguiente tabla muestra algunos ejemplos de la sintaxis de enlazado a datos en ASP.NET. Simple property Collection Expression Customer: <%# custID %> Orders: <asp:ListBox id="List1" datasource='<%# myArray %>' runat="server"> Contact: <%# ( customer.FirstName + " " + customer.LastName ) %>

Method result Outstanding Balance: <%# GetBalance(custID) %>

Aunque esta sintaxis se parezca a la abreviatura de ASP para Response.Write (<%= %>) su comportamiento es totalmente diferente. Mientra que el ASP Response.Write se evalua cuando la pgina se procesa, la sintaxis de enlazado a datos de ASP.NET se evalua slo cuando se invoca el mtodo DataBind. DataBind es un mtodo de Page y todos los controles de servidor. Cuando llamamos a DataBind desde el control padre, l llamara a todos los "hijos" del control. Por ejemplo, DataList1.DataBind() invoca el mtodo DataBind en cada uno de los controles de la plantilla del DataList. Llamando a DataBind en Page

(Page.DataBind() o simplemente DataBind()) provoca que todas las expresiones de enlazado a datos de la pgina se evalen. DataBind se suele llamar desde el evento Page_Load, cmo veremos en el siguiente ejemplo. protected DataBind(); } Podemos utilizar una expresin de enlazado en prcticamente cualquier sitio de una seccin declarativa de una pgina .aspx, siempre que evale el tipo de datos esperado en tiempo de ejecucin. Los ejemplos de propiedad, expresin y mtodo simples mostrados arriba muestran texto al usuario cuando se evalan. En estos casos, la expresin de enlazado a datos debe evaluarse a un valor del tipo String. En ejemplo de grupo, la expresin de enlazado a datos se evala a un valor de un tipo vlido para la propiedad DataSource del ListBox. Encontraremos necesario obligar al tipo de valor en nuestra expresin de enlazado a producir el resultado deseado. Por ejemplo, si count es un integer: Number of Records: <%# count.ToString() %> a sintaxis de enlazado a datos de ASP.NET soporta enlazar a variables pblicas, propiedades de la Page y propiedades de otros controles de la pgina. El siguiente ejemplo muestra cmo enlazar a una variable pblica y una propiedad simple de la pgina. Observad que estos valores se inicializan antes de llamar a DataBind(). The ASP.NET data binding syntax supports binding to public variables, properties of the Page, and properties of other controls on the page. The following example illustrates binding to a public variable and simple property on the page. Note that these values are initialized before DataBind() is called. C# Enlazando a Datos a una Propiedad en la Pgina void Page_Load(Object Src, EventArgs E) {

El siguiente ejemplo muestra el enlace de un apropiedad de otro control.

C#

Enlazando a

Datos

una

Porpiedad

de

Control de

Servidor

Los controles de servidor del tipo lista, como DropDownList, ListBox y HTMLSelect utilizan un grupo como fuente de datos. El siguiente ejemplo muestra el enlazado a tipos de grupos usuales del lenguaje en tiempo de ejecucin. Estos controles se pueden enlazar a grupos que soporten las interfaces IEnumerable, ICollection o IListSource. Ms comunmente, enlazaremos a ArrayList, Hashtable, DataView y DataReader. El siguiente ejemplo muestrs el enlace a ArrayList. C# Enlazando a Datos el DropDownList

El siguiente ejemplo muestra el enlazado a un DataView. Observad que la clase DataView se define en el espacio de nombres System.Data. C# Enlazando a Datos a un DataView

El siguiente ejemplo muestra el enlazado a un Hashtable. C# Enlazando a Datos a un Hashtable

A menudo queremos manipular los datos antes de enlazarlos a nuestra pgina o control. El siguiente ejemplo muestra el enlazafo a una expresin y el valor que devuelve un mtodo. C# Enlazando a Datos a Mtodos y Expresiones

El Framework ASP.NET proporciona un mtodo esttico que evalua expresiones de enlazado a datos "late-bound" y opcionalmente da el formato de string al resultado. DataBinder.Eval es til porque elimina gran parte del "casting" explcito que el desarrollador deber hacer para hacer que los valores sean del tipo deseado. Es particularmente til cuando enlazamos a datos lo controles a una lista, ya que muchas veces los datos tanto de las filas como de los campos deben sufrir una conversin de tipos.

Considerad el siguiente ejemplo, en el que un integer se mostrar como un string. Con la sintaxis de enlaxzado a datos stndar de ASP.NET, debemos convertir el tipo de datos de la fila para poder obtener los datos del campo, IntegerValue. A continuacin, es pasado como argumento al mtodo String.Format.

<%# String.Format("{0:c}", ((DataRowView)Container.DataItem)["IntegerValue"]) %>

Esta

sintaxis

puede

ser

compleja

difcil

de

recordar.

En

cambio,

DataBinder.Eval simplemente es un mtodo con tres argumentos: en contenedor de nombre para el elemento de datos, el nombre del campo de datos y la cadena de formateo. En un control basado en plantilla como FormView, GridView, DetailsView, DataList o Repeater, el contenedor de nomre siempre es

Container.DataItem. Page es otro contenedor de nombre que puede usarse con DataBinder.Eval. Cmo se ha dicho en la seccin anterior, ASP.NET 2.0 tambin incluye una nueva sintaxis simplificada para DataBinder.Eval, simplemente Eval, que puede usarse dentro de una plantilla de un control enlazado a datos para resolver a un Container.DataItem automticamente. La sintaxis simplificada de Eval se discute en la seccin anterior, Enlazando d Datos en Plantillas. <%# DataBinder.Eval(Container.DataItem, "IntegerValue", "{0:c}") %>

<%# Eval("IntegerValue", "{0:c}") %> El argumento de formato de cadena es opcional. Si se omite, DataBinder.Eval devuelve un valor de clase objeto, como se muestra a continuacin: <%# (bool)DataBinder.Eval(Container.DataItem, "BoolValue") %> Es importante observar que DataBinder.Eval puede acarrear un perjuicio notable en el rendimiento respecto a la sintaxis estndar de enlazado, debido a que usa reflexin "late-bound". Tenemos que tilizar DataBinder.Eval juiciosamente, especialmente cuando no necesitamos formateo de cadenas. C# Enlazando a Datos Mediante DataBinder.Eval

Trabajando con Bases de Datos en VWD

Working with Databases in Visual Web Developer 2005 Express Edition Visual Web Developer 2005 Express Edition incluye SQL Server 2005 Express Edition, una edicin gratuita de SQL Server 2005 para desarrolladores amateurs que quieren una solucin simple de base de datos para realizar sus aplicaciones. Debido a que SQL Server Express soporta el modelo de programacin de SQL Server completo (SQLCLR, T-SQL, procedimientos almacenador, vistas, triggers y el tipo de datos XML), podemos ir acostumbrndonos a esta tecnologa utilizando

SQL Server Express, al mismo tiempo que nos aseguramos que nuestra aplicacin sigue funcionando conun SKU de alto nivel, cmo SQL Server Enterprise Edition. SQL Express es fcil de descargar y configurar (ocupa menos de 36MB), y est incluido en el Visual Studio 2005 y Visual Web Developer 2005. Visual Studio incluye herramientas para la administracin de la base de datos, como el "Database Explorer" (explorador de base de datos) y el "Query Builder" (creador de peticiones), qu pueden ser usadas con las bases de datos de SQL Server Express. Visual Studio tambin soporta un nuevo acceso a bases de datos basado en ficheros para la creacin de bases de datos SQL Server Express como parte de nuestro proyecto. Juntos, Visual Studio 2005 y SQL Server 2005 Express proporcionan una solucin completa para construir y desplegar aplicaciones Web orientadas a datos, incluyendo las siguientes caractersticas:

Elemento de proyecto de base de datos Conexiones a base de datos local Administracin mediante "Explorador de Bases de Datos" Cadenas de Rutas de Conexiones Relativas Soporte para el despligue de XCopy Soporte para la depuracin integrado

Esta seccin describe el acceso a bases de datos basado en ficheros en el Visual Studio 2005 y cmo crear y usar estas bases de datos desde el diseador. Visual Web Developer y los Datos Visual Web Developer proporciona herramientes para trabajar con las bases de datos que utilizan nuestras aplicaciones web. Podemos conectarno fcilmente e una base de datos y crear o ver los diagramas o esquemas de la base de datos mediante el Explorados de Bases de Datos. Tambin podemos preguntar a la base de datos y llenar los datos mediante el dilogo "Query Builder" y la rejilla "Query results". La creacin de una nueva base de datos (mediante un fichero local) se muestra cmo un elemento del proyecto (descrito ms adelante).

Una vez tenemos conexin a la base de datos en Visual Web Developer, podemos arrastrar y dejar caer las tablas directamente en la pginas para crear un control GridView enlazado a datos. Visual Web Developer crea automticamente un control de fuente de datos asociado y configurado para las operaciones Select, Update, Insert y Delete en dicha tabla. Este "atajo" nos puede ahorrar el esfuerzo de tener que crear unaa duente de datos manualmente, y podemos reemplazar fcilmente el GridView por el control enlazado a datos ms apropiado para nuestro escenario. Bases de Datos Locales y de Servidor Probablemente estemos familiarizados con las bases de datos de sevidor y las cadenas de conexin. Es esta configuracin, un servidor de bases de datos como SQL Server 2005 asocia un nombre de base de datos a un fichero de base de datos que es adjuntado y mantenido por el servidor. Podemos conectarnos a una base de datos de servidor mediante una cadena de conexin que especifique el nombre del servidor, el de la base de datos y un esquema de autenticacin, por ejemplo: "server=(local)\SQLExpress;database=Pubs;Integrated Security=true" Sin embargo, Visual Studio 2005 tambin soporta la nocin de base de datos local, que se aade como un fichero al directorio App_Data de la actual aplicacin Web. El directorio App_Data es un lugar seguro en el que almacenar los ficheros de datos, ya que el contenido de este directorio nunca se sirve a peticiones de clientes. Adems tambin es la ubicacin recomendada para fichero XML y otros almacenes de datos. Una base de datos local de SQL Server Express tiene una extensin .MDF, por ejemplo "MyDatabase.MDF", que es el tipo de fichero estndar soportado por SQL Server. Cuando estamos conectados a un servidor, la base de datos tambin tiene un fichero de log asociado, por ejemplo "MyDatabase.LDF". Los ficheros de la base de datos y de log deben ser movidos conjuntamente. Un fichero de base de datos local se adjunta a SQL Server Express de forma dinmica a travs del uso de una cadena de conexin de ruta relativa. La ruta

relativa asegura que la aplicacin puede moverse a otra ubicacin sin romper la conexin a la base de datos. Una cadena de conexin de ruta relativa en una aplicacin Web se especifica de la siguiente forma: "server=(local)\SQLExpress;AttachDbFileName=|DataDirectory|MyDatabas e.mdf;Integrated Security=true;User Instance=true" Hay dos propiedades adicionales de la cadena de conexin anterior. La propiedad AttachDbFileName especifica la ubicacin del ficher de la base de datos que se adjuntar al servidor de forma dinmica cuando se abra la conexin. Aunque esta propiedad puede aceptar una ruta completa a la base de datos, este ejemplo usa la sintaxis |DataDirectory|, que se substituir por el path al directorio App_Data de la aplicacin Web en tiempo de ejecucin. sto es lo que permite a la aplicacin ser movida a una ubicacin diferente sin romper la conexin. En segundo lugar, la propiedad User Instance=true dicta la forma en la que SQL Server Express atar la base de datos. En este caso, SQL Server Express engendra un nuevo proceso que correr como el usuario que ha abierto la conexin para atar la base de datos a esta nueva instancia. En aplicaciones ASP.NET, este usuario ser la cuenta local ASPNET o el Network Service, dependiendo del sistema operativo. Una instancia de usuario separada de SQL Server es necesaria para adjuntar de forma segura ficheros desde una cuenta sin permisos de administracin, cmo la cuenta ASP.NET.

Importante: Debido a que todas las aplicaciones ASP.NET corren bajo la misma cuenta de usuario por defecto, todas las aplicaciones ligarn bases de datos locales a la misma instancia de SQL Server Express. sto implica que todas las aplicaciones tendrn el mismo acceso a todas las bases de datos ligadas a esta instancia, independientemente de la aplicacin individual que lig la base de datos inicialmente. Para aislar las aplicaciones cuando usamos SQL Sever Express, debemos ejecutar cada aplicacin en un proceso diferente o "application pool" (bajo IIS 6). Por esta razn, las bases de datos localoes de SQL Server se consideran una comodidad para el desarrollo, y no un reemplaxzo de las bases de datos de servidos en escenarios de hosting compartido. Para ms informacin

sobre cmo mover los contenidos de una base de datos local a una base de datos de servidor, acudid al punto de "despliegue" del final de esta seccin. Otro punto importante es que dos usuarios no deben estar conectados a la misma base de datos al mismo tiempo. Cundo diseemos una aplicacin en Visual Studio, el diseador se tiene que preocupar de liberar automticamente las conexiones para permitir al Visual Studio y ASP.NET compartir el acceso al fichero (cuando ejecutamos la aplicacin para depurar desde el diseador, por ejemplo). Creando una Base de Datos Local Podemos crear de forma sencilla una base de datos local en un proyecto de aplicacin Web en Visual Studio. Siempre que instalemos SQL Server Express con Visual Studio, podremos seguir los siguientes pasos para crear una base de datos local, aadir tablas y rellenar los datos.

Para crear una base de datos local: 1. Hacemos clic con el botn derecho sobre "Solution Explorer" y seleccionamos la opcin "Add New Item...". 2. Seleccionamos el elemento "SQL Database" y le damos un nombre, por ejemplo "Database.mdf". 3. Visual Studio nos pedir si queremos aadir el fichero al directorio "App_Data". Hacemos clic en "Yes". 4. Visual Studio aadir el fichero y se conectar automticamente a la base de datos mediante el "Database Explorer".

Para aadir una tabla a la base de datos local: 1. Hacer clic con el botn derecho en el nodo "Tables" del "Database Explorer" y seleccionar la opcin "Add New Table". 2. Intorducir los nombres y tipos para las columnas de la base de datos, estableciendo de forma opcional, las propiedades de las columnas en la rejillas de propiedades. Para crear una base de datos de contactos de ejemplo, seguid los siguientes pasos. 3. Estableced el nombre de la primera columna a "ContactID" y establecer el tipo de datos a "int". Deseleccionar el checkbox "Allow Nulls" de la columna. 4. Hacer clic con el botn derecho en la casilla gris con una flecha, al lado de la columna ContactID, y seleccionar la opcin "Set Primary Key". 5. En la columna "Properties grid", debajo de la rejilla de columnas, expandir el nodo "Identity Specification" y fijar "Is Identity" a "Yes". 6. Establecer el segundo nombre de columna a "ContactName" y establecer el tipo de datos a "varchar(50)". Dejar el checkbox "Allow Nulls" seleccionado. 7. Teclear Ctrl-S para salvar la tabla y darle el nombre "Contacts". Hacer clic en OK para salvarla. 8. Cerrar la ventana de definicin de tablas.

Para rellenar una tabla con datos: 1. Hacer clic con el botn derecho sobre el nodo de la tabla (por ejemplo "Contacts") en el "Database Explorer" y selecionar la opcin "Show Table Data". 2. Introducir los datos en las columnas de nuestra tabla en el cuadro de resultados. Si seguimos el ejemplo de "Contacts", podemos introducir valores para "ContactName" y la base de datos generar de forma automtica los valores de "ContactID". 3. Cerrar el cuadro de resultados.

Enlazando a una base de datos local Para enlazar a una base de datos local podemos configurar un control de fuente de datos de ASP.NET para conectarse al fichero mediante una conexin de ruta relativa. Para enlazar fcilmente una base de datos SQL Server Express a un control SqlDataSource y GridView, seguiremos estos pasos: 1. Hacer doble clic en una pgina en el "Solution Explorer", por ejemplo "Default.aspx". Visual Studio abrir el fichero. 2. Seleccionar la pestaa "Design View" debajo de la ventana de la pgina para cambiar a la Vista de Diseo. 3. Hacer doble clic sobre el fichero de base de datos en el "Solution Explorer", por ejemplo "Database.mdf". Visual Studio abrir el "Database Explorer" para esta conexin. 4. Expandir los nodos de las tablas para mostrar las tablas de la base de datos. 5. Arrastras y dejar caer una tabla desde el "Database Explorer" a la ventana de la pgina abierta en "Design View". Visual Studio crear un GridView enlazado a un control SqlDataSource. 6. Expandir el "Smart Task Panel" en el control GridView y permitir la paginacin, clasificacin y edicin para la rejilla. 7. Teclear Ctrl-F5 para ejecutar las pgina (sin depurar). El siguiente ejemplo muestra un GridView y un SqlDataSource conectados a una base de datos. Para ejecutar este ejemplo, la cuenta con la que se ejecuta el proceso ASP.NET debe tener permisos de lectura/Escritura en los ficheros MDF y LDF del directorio ~/App_Data. Para asegurar estos permisos seguid los siguientes pasos:

1. Seleccionar el fichero ~/App_Data/Database.MDF en el explorador de Windows y seleccionar sus Propiedades 2. Seleccionar la pestaa de Seguridad y hacer clic en aadir... 3. Hacer clic en Ubicaciones..., seleccionar nuestro ordenador (a principio de la lista) y hacer clic en OK 4. En el area de texto de nombres del objeto, escribir el nombre de la cuenta del proceso ASP.NET. Por defecto es "Network Service" en IIS 6 o "ASPNET" en IIS 5.x 5. Comprobar que est seleccionado "Lectura" y "Escritura" en la columna de permitir y hacer clic en OK 6. Repetir esta operacin con el fichero LDF del directorio App_Data, si existe Si hemos creado la aplicacin en nuestro ordenador mediante Visual Studio, los permisos que se mencionan arriba ya estarn garantizado spor defecto en el directorio App_Data. Si necesitamos modificar los permisos del fichero de la base de datos despus de adjuntarlo, tendremos que apagar el dominio de la aplicacin para que los permisos se apliquen. Acudid a la informacin de abajo "app_offline" para instrucciones de apagado de la aplicacin ASP.NET. C# Enlazando a una Base de Datos Local

Despliegue de la Base de Datos Local Un beneficio de una base de datos local es que se puede mover fcilmente como parte de la aplicacin a otra ubicacin o mquina (siempre que es dicha mquina tambin est ejecutndose SQL Server Express). Para mover la base de datos, el fichero debe desbloquearse. Mientras que un diseador o aplicacin estn conectados a la base de datos, el fichero permanecer bloqueado. Para desbloquear la base de datos, todas las conexiones activas a la base de datos deben cerrarse. Podemos cerrar dichas conexiones mediante las siguientes tcnicas:

Si ASP.NET tiene conexiones abiertas, podemos apagar la aplicacin aadiendo un fichero llamado "app_offline.htm" al directorio raz de la aplicacin Web. sto tiene el efecto de apagar el dominio de la aplicacin (no el proceso) y redireccionar todas las peticiones que se hacen a la aplicacin a este fichero (devolviendo una respuesta de cdigo 404). Para permitir que la aplicacin se reinicie, slo tendremos que borrar este fichero. Observad que el simple hecho de cerrar las conexiones en el cdigo de nuestra pgina no libera el bloqueo del fichero, porque por defecto la conexin ADO.NET mantiene las conexiones activas.

Visual Studio proporciona la caracterstica Copy Web para mover los ficheros de aplicacin desde el directorio de trabajo a un servidor, mediante xcopy, FTP o las Extensiones de Servidor de FrontPage. El servidor objetivo puede ser local o remoto. Para llamar a la caracterstica de Copy Web elegiremos "Website > Copy Web Site..." en la barra de men de Visual Studio. Mientras copiamos la base de datos usando Copy Web o una simple operacin xcopy o FTP, la mquina objetivo debe estar ejecutando tambin SQL Server Express (baja la instancia del mismo nombre) para que la aplicacin contine funcionando. Cmo hemos comentado arriba, debido a que las aplicaciones que se ejecutan como ASP.NET se conectan a la misma instancia SQL, todas las aplicaciones de la mquina objetivo deben confiar las unas en las otras. En mquinas en las que las aplicaciones no podrn ver las bases de datos del resto, el enfoque basado en servidor (usando autenticacin SQL o otra tcnica de aislamiento) se recomienda en lugar de una base de datos local. Si usamos SQL Server Express como herramienta de desarrollo, necesitaremos copiar los contenidos de la base de datos a la base de datos que proporciona el servidor, como parte del despliegue de produccin.

Validando Controles de Entrada de Formularios

Lo nuevo de 2.0

Grupos de Validacin - Podemos asignar un nombre de grupo a un conjunto de validadores para asegurarnos que se produce la validacin slo para controles del grupo especificado. sto nos permite tener mltiples grupos de control, que se validan de forma separada, en la misma pgina. Fijar el Foco en el Error - Mediante la nueva caracterstica de API de Foco de ASP.NET, los validadores se pueden configurar para fijar el foco en su control asociado que queremos validar, cuando se produce un error de validacin. El primer control del formulario que tiene un error de validacin recibir el foco cuando se enva el formulario. Valores Invariantes de Regiones - Cuando hacemos conversiones en una propiedad no fuertemente tipada de un validador de comparacin (CompareValidator.ValueToCompare, RangeValidator.MaximumValue, RangeValidatos.MinimumValue) el validador usar un formato neutral de regin (Fecha:YYYY/MM/DD, Double & Moneda:formato de regin US) para hacer la conversin cuando CultureInvariantValues vale "true". Validacin de Texto Vaco - La propiedad ValidateEmptyText fija una cuestin clave de CustomValidator. En ASP.NET 1.0 la validacin personalizada no funcionaba si el ValidationText estaba vaco. Podemos fijar esta propiedad a "true" para que se produzca la validacin personalizada para valores vacos de entrada.

Este apartado discute estas y otras caractersticas de validacin en ASP.NET 2.0.

El Framework de Formularios Web incluye un conjunto de controles de servidor de validacin que proporcionan una forma sencilla pero poderosa de comprobar los formularios de entrada en busca de errores y, si es necesario, mostrar mensajes al usuario. Los controles de validacin se aaden a una pgina de Formularios Web de la misma forma que el resto de controles. Hay controles para tipos especficos de validacin, por ejemplo comprobacin de rango o coincidencia con patrones, adems de un RequiredFieldValidator que asegura que un usuario no olvide rellenar un campo. Podemos "ligar" ms de un control de validacin a un control de entrada. Por ejemplo, podramos especificar tanto que un campo es obligatorio y que debe contener un rango especfico de valores.

Los controles de validacin trabajan un limitado subconjunto de controles de servidor HTML y Web. Para cada control, una propiedad especfica contiene el valor que se validar. La siguiente tabla muestra los controles de entrada que pueden ser validados. Control HtmlInputText HtmlTextArea HtmlSelect HtmlInputFile TextBox ListBox DropDownList RadioButtonList FileUpload Propiedad de Validacin Value Value Value Value Text SelectedItem.Value SelectedItem.Value SelectedItem.Value FileName

Tipos de Controles de Validacin El formulario de validacin ms sencillo es un campo obligatorio. Si el usuario introduce un valor en el campo, es vlido. Si todos los campos de la pgina son vlidos, la pgina es vlida. El siguiente ejemplo muestra el uso de RequiredFieldValidator.

C#

RequiredFieldValidator

Tambin hay controles de validacin para tipos especficos de validacin, cmo control de rango o coincidencia con un patrn. La siguiente tabla muestra los controles de validacin. Nombre del Control RequiredFieldValidator CompareValidator Descripcin Asegura que el usuario no se deja un campo Compara los datos que introduce el usuario con una constante o el valor de una propiedad de otro control mediante un operador de comparacin (menor que, igual que, mayor que, etc.). Comprueba que la entrada del usuario se encuentra entre un lmite superior y otro inferior. Podemos comprobar los rangos con parejas de nmeros, caracteres alfabticos o fechas. Los lmites se pueden expresar como constantes.

RangeValidator

RegularExpressionValidator Comprueba que la entrada sigua un patrn definido como una expresin regula. Este tipo de validacin nos permite comprobar secuencias predecibles de caracteres, tales como nmeros de seguridad social, direccin de e-amil, nmeros de telfono, cdigos postales, etc. CustomValidator Comprueba la entrada de usuario mediante lgica de validacin que hemos programado nosotros. Este tipo de validacin nos permite comprobar valores obtenidos en tiempo de validacin. Muestra los errores de validacin en un formulario resumen para todos los validadores de la pgina.

ValidationSummary

Validacin del Lado Cliente Los controles de validacin siempre realizan operaciones de validacin comprobando en el cdigo del servidor. Sin embargo, si el usuario trabajo con un navegador que soporta DHTML, los controles de validacin pueden realizar la validacin mediante scripts de cliente. Con la validacin del lado del cliente, cualquier error se detecta en el cliente cuando se enva el formulario al servidor. Si cualquiera de los validadores encuantra un error, el envo del formulario al servidor se cancela y se muestra la propiedad Text del validador. sto permite al usuario corregir la entrada antes de enviar el formulario al servidor. Los valores de los campos se revalidan cuando el campo que contena el error pierde el foco, proporcionando as una experiencia rica e interactiva de validacin al usuario. Observad que el Framework de Pginas de Formularios Web siempre realiza la validacin en el servidor, incluso cuando ya se ha hecho en el cliente. sto nos ayuda a impedir que los usuarios puedan saltarse la validacin hacindose pasar por otro usuario o una transaccin prviamente aprobada.

La validacin del lado del cliente est permitida por defecto. Si el cliente lo permite, la validacin de nivel superior se realizar de forma automtica. Para deshabilitar la validacin del lado del cliente, estableceremos la propiedad ClientTarget de la pgina a "Downlevel" ("Uplevel" fuerza la validacin del lado cliente). validacin De forma del alternativa, lado podemos cliente establecer para la propiedad control. EnableClientScript de un control de validacin a "false" para deshabilitar la dicho

C#

Validacin

del

Lado

Cliente

Mostrando Errores de Validacin Cuando se procesa una entrada de usuario (por ejemplo, al enviar un formulario), el Framework de Pginas de Formularios Web pasa la entrada de usuario al control o controles de validacin. Los controles de validacin testean las entradas del usuario y establecen una propiedad para indicar si la entrada ha pasado el test de validacin. Despus de procesarse todos los controles de validacin, la propiedad IsValid de la pgina se establece; si alguno de los controles muestra un fallo de validacin, la pgina entera se marca como invlida.

Si un control de validcin da un error, dicho control mostrar un mensaje de error en la pgina o en un control ValidationSummary en cualquier otro lugar de la pgina. El control ValidationSummary se muestra cuando la propiedad IsValid de la pgina est establecida a "false". Sondea el resto de controles de validacin de la pgina y agrega el texto que cada uno muestra. En el siguiente ejemplo vemos cmo mostrar errores con un control ValidationSummary.

C#

ValidationSummary

Trabajando con CompareValidator El control de servidor CompareValidator compara los valores de dos controles. CompareValidator utiliza tres propiedades clave para realizar su validacin. ControlToValidate y ControlToCompare contienen los valores a comparar. Operator define el tipo de comparacin a realizar (por ejemplo Igual o Diferente). CompareValidator realiza la validacin mediante la evaluacin de estas propiedades como una expresin, de la siguiente manera: ( ControlToValidate ControlToCompare )

Si el resultado de la validacin es "true", el resultado de validacin es vlido. Podemos especificar opcionalmente la propiedad ValueToCompare para realizar la comparacin con un valor esttico, en lugar de ControlToCompare. El control de servidor CompareValidator tambin puede utilizarse para realizar la validacin de Datatype. Por ejemplo, si la informacin de la fecha de nacimiento se tiene que recoger de la pgina de que de se registro enve del a usuario, la base el de control datos. CompareValidator se puede utilizar para asegurarnos que la fecha tiene un formato reconocido, antes

El siguiente ejemplo muestra cmo utilizar el control CompareValidator.

C#

CompareValidator

Trabajando con RangeValidator El control de servidor RangeValidator comprueba si un valor de entrada se encuentra dentro de un determinado rango. RangeValidator utiliza tres propiedades clave para realizar su validacin. ControlToValidate contiene el valor a validar. MinimumValue y MaximumValue definen los valores mnimo y mximo del Este ejemplo muestra el rango uso del control vlido. RangeValidator.

C#

RangeValidator

Trabajando con Expresiones Regulares El control de servidor RegularExpressionValidator comprueba que una entrada coincida con un determiado patrn definido por una expresin regular. Este tipo de validacin nos permite comprobar secuencias predecibles de carcteres, como nmeros de la seguridad social, direcciones de e-mail, nmeros de telfono, cdigos postales, etc.

RegularExpressionValidator utiliza dos propiedades clave para realizar la validacin. ControlToValidate contiene el valor a validar. ValidationExpression contiene la expresin regular con la que tiene que coincidir.

Estos ejemplos muestran el uso del control RegularExpressionValidator.

C#

RegularExpressionValidator

C#

RegularExpressionValidator

Realizando Validacin Personalizada El control de servidor CustomValidator llama a una funcin definida por el usuario para realizar validaciones que los validadores estndar no pueden llevar a cabo. La funcin personalizada se puede ejecutar en el servidor o en un script del lado del cliente, por ejemplo JScript o VBScript. Para la validacin personalizada en el lado del cliente, el nombre de la funcin debe definirse en la propiedad

ClientValidationFunction. myvalidator(source,

Dicha

funcin Observad

debe que

tener

la

forma es el

function objeto

arguments).

source

CustomValidator del lado cliente, y arguments es un objeto con dos propiedades, Value y IsValid. La propiedad Value es el valor que tendremos que validar y la propiedad IsValid es un Boolean en el que se dovolver el resultado de la validacin.

Para validacin personalizada del lado del servidor, tendremos que poner nuestra validacin en el delegado de OnServerValidate del validador.

El siguiente ejemplo muestra cmo utilizar el control CustomValidator.

C#

Custom

Validator

ValidateEmptyText Nuevo en 2.0 La propiedad ValidateEmptyText, nueva en ASP.NET 2.0, soluciona un problema con CustomValidator. En ASP.NET 1.0, la validacin personalizada no se ejecutaba si el texto de ControlToValidate estaba vaco. Podemos fijar esta propiedad a "true" para hacer que la validacin personalizada se realice para valores de entrada vacos. Validation Groups Nuevo en 2.0 La propiedad ValidationGroup se utiliza cuando el usuario quiere tener escenarios de validacin diferentes en la misma pgina. Estableceremos el nombre del grupo en el validador y en el botn o en otro control "postback" que cause la validacin. sto es til con controles Wizard, MultiView o controles de datos (edicin). Por defecto, todos los validadores se encuentran en el grupo "" (grupo por defecto), para compatibilidad haca atrs (con versiones anteriores). Page nos proporciona adems los mtodos GetValidators("group") y Validate("group"). Page.IsValidrefleja la validez de todos los controles

(acumulativa)

que

han

sido

llamados

Validate

El siguiente ejemplo muestra la propiedad ValidationGroup. Para ver su comportamiento, haced clic en el primet botn (Search) de la pgina, despus haced clic en el segundo botn. Observad que se ejecutan un grupo de validadores diferente en cada clic.

C#

Validation

Groups

SetFocusOnError Nuevo en 2.0 Otra caracterstica nueva de ASP.NET 2.0 es SetFocusOnError que se establece en controles de validacin y hace que el primer control invlido reciba el foco. Para ms informacin sobre SetFocusOnError acudid al tpico Focus API de la seccin Tips and Tricks. Un Formulario Tpico de Validacin Este ejemplo muestra un formulario tpico de registro, utilizando las variaciones de validacin que hemos explicado en este captulo.

C#

Validation

Form

Aplicando Estilos, Temas y Skins

Lo nuevo en 2.0

Temas y Skins - La caracterstica de Temas y Skins de ASP.NET 2.0 nos permite factorizar la informacin de estilo y diseo en un grupo separado de ficheros, a cuyo conjunto llamamos "Tema". Un Tema se puede aplicar a cualquier sitio de forma que afecte a la apariencia y entorno de las pginas y controles del sitio. Los cambios en el Estilo de un sitio pueden administrarse realizando cambios al Tema, sin tener que editar las pginas de forma individual. Los Temas tambin se pueden compartir con otros desarrolladores.

Esta seccin muestra estas y otras caractersticas relacionadas con los estilos en ASP.NET 2.0.

ASP.NET incluye varias caractersticas para personalizar la apariencia o el estilo de las pginas y los controles de nuestra aplicacin. Los controles soportan un modelo de objeto Style para establecer las propiedades de estilo como fuentes, bordes, colores de fondo y primer plano, anchura, altura, etc. Los controles tambin soportan completamente "Cascading Style Sheets" (CSS) para factorizar los ajustes de estilo de forma separada de las propiedades de los controles. Podemos definir la informacin de los estilos como propiedades de los controles o CSS, o podemos definir esta informacin en grupos de ficheros separados llamados Theme (Tema), que se aplicarn a todas o una parte de las pginas de la aplicacin. Los estilos de controles individuales se especifican como un Skin dentro de un Tema. Esta seccin nos muestra una variedad de usos para las caractersticas de Estilos, Temas y Skins de ASP.NET 2.0.

Aplicando Estilos a Controles La Web es un entorno flexible para las interfaces de usuario, con variaciones extremas en el aspecto de diferentes Web Sites. La adopcin generalizada de "Cascading Style Sheets" (CSS) es la responsable de los ricos diseos que podemos encontrar en la Web. Todos los controles de servidor de ASP.NET y los

controles de servidor web has sido diseados para soportar los estilos CSS de primera clase. Esta seccin discute cmo utilizar estos estilos junto con controles de servidor y nos muestra el buen control que nos proporcionan sobre la apariencia de nuestros Formularios Web. Aplicando Estilos a Controles HTML Las etiquetas estndar HTML soportan CSS a travs del atributo "style" (estilo), que se puede fijar a una lista de parejas atributo/valor delimitada por puntos y comas. Para ms informacin sobre los atributos CSS soportados por el navegador Internet Explorer, visitad la pgina Referencia de Atributos CSS del MSDN. Todos los controles HTML de servidor de ASP.NET pueden aceptar estilos de la misma forma que las etiquetas HTML estndares. El siguiente ejemplo varios estilos aplicados a diferentes controles de servidor. Si observamos el cdigo fuente de la pgina devuelta al cliente, veremos que estos estilos se pasan al navegador en la representacin de los controles. C# Style1.aspx

CSS tambin defina un atributo de clase que puede puede fijarse a una definicin de estilo CSS contenida en una seccin <style>...</style> del documento. El atributo de clase hace ms sencillo definir los estilos una vez y aplicarlos a diferentes etiquetas sin tener que redefinir el estilo. Los estilos en controles HTML de servidor tambin se pueden establecer de esta forma, tal y como muestra el siguiente ejemplo. C# Style2.aspx

Cuando se analiza una pgina ASP.NET, la informacin de estilo se rellena dentro de una propiedad Style (del tipo CssStyleCollection) dentro de la clase System.Web.UI.HtmlControls.HtmlControl. Esta propiedad es, esencialmente, un diccionario que muestra los estilos del control como grupos de valores indexados por cadenas, para cada clave de "style-attibute". Por ejemplo, podemos usar el siguiente cdigo para fijar y, consecuentemente, obtener el atributo de estilo "width " (ancho) de un control de servidor HtmlInputText. <script language="C#" runat="server" EventArgs E) > { "90px";

void Page_Load(Object sender, MyText.Style["width"] = Response.Write(MyText.Style["width"]); } </script> <input type="text" id="MyText" runat="server"/>

El siguiente ejemplo muestra cmo podemos manipular de forma programada el estilo de un control HTML de servidor mediante la propiedad de grupo de "Style" (estilos). C# Style3.aspx

Aplicando Estilos a Controles Web de Servidor Los controles Web de Sevidor proporcionan un nivel adicional de soporte para estilos, aadiendo varias propiedades fuertemente tipadas para los ajustes de estilos ms usados, tales como color de fondo, nombre y tamao de la fuente, etc. Estas propiedades de estilo representan un subconjunto de los comportamientos de estilo disponibles en HTML y se representan como propiedades llanas accesibles directamente a travs La de la de clase usar base estas System.Web.UI.WebControls.WebControl. ventaja

propiedades es que proporcionan comprovacin en tiempo de compilacin y finalizacin de declaraciones en herramientas de desarrollo como Microsoft Visual

Studio

.NET.

El siguiente ejemplo muesta un control WebCalendar con varios estilos aplicados a l (se incluye un calendatio sin estilos aplicados para contrastar). Observad que al fijar una propiedad que es un tipo de clase, por ejemplo Font, necesitamos usar la sintaxis de subpropiedad PropertyName-SubPropertyName. C# Style4.aspx

El espacio de nombres System.Web.UI.WebControls incluye una clase base Style que encapsula los atributos de estilo comunes (las clases adicionales de estilo, como TableStyle y TableItemStyle heredan de esta clase base comn). Varios controles Web de servidor dan acceso a ropiedades de este tipo para especificar el estilo de elementos individuales de representacin del control. Por ejemplo, -da acceso a propiedades de acceso como: DayStyle, WeekendDayStyle, TodayDayStyle, SelectedDayStyle, OtherMonthDayStyle y NextPrevStyle. Podemos fijar propiedades individuales para estos estilos mediante la sintaxis de subpropiedad PropertyName-SubPropertyName, como muestra el siguiente ejemplo. C# Style5.aspx

Una sintaxis ligeramente diferente permite declarar cada propiedad de Style como un elemento hijo, anidado dentro de las etiquetas del control Web de servidor. <ASP:Calendar ... <TitleStyle BorderColor="darkolivegreen" BackColor="olivedrab" Height="50px" runat="server"> BorderWidth="3" />

</ASP:Calendar>

El siguiente ejemplo muestra una sintaxis alternativa, cuya funcionalidad es equivalente a la anterior. C# Style6.aspx

De la misma forma que con los controles HTML de servidor, podemos aplicar estilos a controles Web de servidor mediante una definicin de clase CSS. La clase base WebControl permite el acceso a una propiedad String llamada CssClass para establecer la clase estilo. C# Style7.aspx

Si se establece un atributo en un control de servidor que no correspondo a una propiedad fuertemente tipada del control, el atributo y el valor se rellenan en el grupo Attributes del control. Por defecto, los controles de servidor representarn estos atributos sin modificarlos en el HTML devuelto al navegador cliente que los haya pedido. sto significa que los atributos de estilo y clase se pueden establecer directamente en controles Web de servidor, en lugar de usar las propiedades fuertemente tipadas. Mientras que sto requiere algo de comprensin de la representacin real del control, tambin puede ser una forma flexible de aplicar estilos. sto es especialmente til para los controles de entrada de formulario estndaresm cmo veremos en el siguiente ejemplo.

C#

Style8.aspx

Los estilos de los controles Web de servidor se pueden establecer mediante cdigo utilizando el mtodo ApplyStyle de la clase base WebControl, cmo vemos en el siguiente cdigo. <script language="C#" void Page_Load(Object Src, Style style = style.BorderColor = style.BorderStyle = style.BorderWidth MyLogin.ApplyStyle MyPassword.ApplyStyle MySubmit.ApplyStyle } </script> EventArgs new runat="server"> E ) { Style(); Color.Black; BorderStyle.Dashed; 1; (style); (style); (style);

Login: <ASP:TextBox id="MyLogin" runat="server" />/<p/> Password: <ASP:TextBox id="MyPassword" TextMode="Password" runat="server" /> View: <ASP:DropDownList id="MySelect" runat="server"> ... </ASP:DropDownList> El siguiente ejemplo ejemplifica el cdigo anterior. C# Style9.aspx

Usar Temas para Personalizar un Sitio Usar Temas para Personalizar un Sitio En la seccin anterior vimos varias formas de especificar estilos a los controles fijando las propiedades de los estilos en los propios controles. Por ejemplo,

consideremos la siguiente pgina, qu tiene varios ajustes del estilo aplicados a los controles individuales de la pgina. C# Pgina Sin Tema Aplicado

Adems de especificar estilos en controles individuales, ASP.NET 2.0 introduce Temas, los cuales nos ofrecen una manera fcil de definir estilos para controles y pginas de nuestro sitio, de forma separada a las pginas de nuestra aplicacin. El beneficio de los Temas es que puedes disear un sitio sin preocuparte por el estilo y aplicarlo ms tarde sin tener que actualizar las pginas o el cdigo de la aplicacin. Tambin puedes obtener temas personalizados de una fuente externa para aplicar ajustes estilsticos a tu aplicacin. Otro beneficio es que los ajustes de estilo estan almacenados en una nica ubicacin y pueden ser mantenidos de forma independiente de la aplicacin a la que se le aplica el Tema. El siguiente ejemplo muestra la misma pgina con un tema aplicado para especificar los ajustes de estilo para el control. Observad que la pgina en s mismo no necesita contener ninguna informacin de estilo. El tema aplica automticamente las propiedades de estilo a los controles en la pgina en tiempo de ejecucin. C# Pgina con el Tema de Ejemplo Aplicado

La carpeta App_Themes Los temas residen en la carpeta App_Themes, directamente bajo el directorio raz. Un tema consiste en un subdirectorio bajo esta carpeta que contiene un grupo de

uno o mas ficheros Skin, con extensin .skin. Un tema puede contener tambin un fichero CSS y/o subdirectorio para ficheros estticos, por ejemplo imgenes. La siguiente figura muestra el directorio App_Themes con dos temas definidos, llamados "Default" y "White", cada uno de los cuales tiene un slo fichero skin y uno CSS.

Observad en el ejemplo previo que los contenidos de un fichero skin son simplemente definiciones de control, tal y como ellas deben aparecer en la pgina. Un fichero de skin puede contener varias definiciones de control, por ejemplo una definicin por cada tipo de control. Las propiedades de controles definidas en el tema sobreescriben automticamente los valores de la propiedad local de un control del mismo tipo en la pgina en la que aplicamos el tema. Por ejemplo, una definicin de un control del tipo <asp:Calendar Font-Name="Verdana" runat="server"/> que se encuentre en un fichero skin causar que todos los controles Calendar en pginas con el Tema aplicado utilizarn la fuente Verdana. Un valor locar para dicha propiedad se sobreescribir. Observad que es un error especificar un valor de ID de propiedad para una definicin de control en un fichero de skin. Temas Globales y de Aplicacin Un tema puede residir en un nivel de aplicacin o en un nivel mquina (accesible de forma global para todas las aplicaciones). Los temas de nivel de aplicacin se

encuentran en el directorio App_Themes bajo el directorio raz de la aplicacin, como se ha descrito anteriormente. Los temas globales se colocan en el directorio "Themes", bajo una carpeta ASP.NETClientFiles, bajo el directorio de instalacin de ubicacin de los ASP.NET, temas globales para por los sition web de ejemplo IIS es %WINDIR%\Microsoft.NET\Framework\<version>\ASP.NETClientFiles\Themes. La Inetpub\wwwroot\aspnet_client\system_web\<version>\Themes. Asignando un Tema a una Pgina Se puede aignar un tema a una pgina individual estableciendo la directiva <%@ Page Theme="..." %> al nombre del Tema de nivel global o de aplicacin (el nombre de la carpeta bajo el directorio Themes o App_Themes). Una pgina puede tener slo un tema aplicado, pero en dicho tema pueden haber varios ficheros skin para aplicar configuraciones de estilo a los controles de la pgina. Asignando un Tema en Config Tambin podemos definir el tema aplicado para todas las pginas de la aplicacin especificandolo en la seccin <pages theme="..."/> de Web-config. Para quitar este tema en una pgina particular podemos establecer el atributo Theme de la directiva de la pgina a un string vaco (""). Observad que una master page no puede tener un tema aplicado; tendremos que establecer el tema en pginas de contenido o en la configuracin (descrito a continuacin).

C#

Asignando

un

Tema

en

Web.config

Deshabilitando Temas para un Control Un control especfico puede ser excluido de tener que sobreescribir sus propiedades mediante el establecimiento de la propiedad EnableTheming a false.

C#

Deshabilitando

Temas

para

un

Control

Skins identificados en un Tema Por defecto, la definicin de un control en un fichero de skin se aplica a todos los controles del mismo tipo en las pginas de la aplicacin. Sin embargo, podemos querer que los controles del mismo tipo tengan apariencias diferentes en distintas partes de la aplicacin. Por ejemplo, podramos querer que el texto de un control Label aparezca en negrita en una parte i en italic en otra. Podemor hacer esto mediante skins identificados en un tema. <a name="named"> Skins Por Defecto e Identificados Podemos definir diferentes estilos para controles del mismo tipo en un fichero skin mediante la creacin de definiciones separadas del control. En las definiciones de los controles pordemos establecer diferentes propiedades SkinID a nombres de nuestra eleccin, y despus establecer este mismo SkinID en los controles de las pginas que tendrn dicho skin aplicado. En ausencia de la propiedad SkinID, se aplica el skin por defecto (uno sin la propiedad SkinID fijada). El siguiente ejemplo muestra diferentes skins para los controles Label y Calendar. Observad que a los controles de una pgina con un SkinID establecido se les aplica un grupo de estilos diferente al skin por defecto. C# Skins Identificados en un Tema

Los skins identificados se pueden organizar de diferentes formas dentro de los ficheros de skin de los temas. Debido a que un tema puede contener varios ficheros de skin debemos dividir los skins identificados en diferentes ficheros, de forma que cada uno de estos ficheros contenga las definiciones de controles con

el mismo SkinID. Por ejemplo, podemor tener tres ficheros de skin en un Tema, cada uno nombrado segn el valor de SkinID: /WebSite1 /App_Themes /MyTheme Default.skin Red.skin Blue.skin Alternativamente podramos agrupar los ficheros de control segn el tipo de control, de forma que cada skin contendra un conjunto de definiciones de skin para un control particular: /WebSite1 /App_Themes /MyTheme GridView.skin Calendar.skin Label.skin Podemos incluso dividir estos ficheros de skin basndonos en las reas de nuestro sitio, por ejemplo: /WebSite1 /App_Themes /MyTheme HomePage.skin DataReports.skin Forums.skin La posibilidad de tener varios ficheros de skins en un mismo directorio Theme nos da esta flexibilidad de organizacin. Adems nos permite compartir fcilmente las definiciones de skins con otros o copiar las definiciones de un tema a otro sin tener que editar otros ficheros de skin de un Tema.

Estilos del Lado de Servidor Utilizando Temas

Un Tema est destinado a ser aplicado a una aplicacin despus de haberla creado, incluso despus de que el sitio ya est hospedado en un servidor. La persona que aplica el tema a la aplicacin no tiene porque ser la misma que la desarroll. Por ejemplo, es comn tener desarrolladores de aplicacin y diseadores del web site trabajando en diferentes aspectos del sitio. Cuando se aplica un Tema a una aplicacin, las propiedade de estilo que se encuentran en la definicin del Tema sobreescriben los valores de los controles de destino en las pginas de aplicacin.

Por otro lado, es algo comn entre los desarrolladores factorizar informacin estilstica y el comportamiento de servidor por separado. Un ejemplo de esto es la utilizacin de CSS para definir los estilos de control y de marcado en un fichero separado. Tambin podemos utilizar Temas para este propsito, aplicando el Tema como una especie de hoja de estilos del lado de servidor. Cuando lo aplicamos de esta forma, las propiedades de estilo en la definicin del Tema establecen el valor por defecto para los controles de la aplicacin, pero estas propiedades pueden establecerse tambin en la pgina de control para sobreescribir la definicin del Tema. Estilos Declarativos del Lado del Servidor Cuando aplicamos un tema estableciendo el atributo Theme de la directiva @Page o de la seccin <pages/> de configuracin, las propiedades de skins del tema sobreescriben las del mismo nombre de los controles destino de la pgina. El siguiente ejemplo muestra un "Label" con su propiedad ForeColor fijada a azul. En el tema aplicado, el skin de "Label" define la propiedad ForeColor a naranja. Observad al ejecutar la pgina que la definicin del Tema gana sobre la propiedad local del control, y todos los Labels se representan naranjas. C# Los Temas Sobreescriben las Porpiedades de la Pgina

Una definicin de Tema se puede aplicar como un estilo del lado de servidor estableciendo el atributo StyleSheetTheme de la directiva @Page o de la seccin <pages/> de la configuracin al nombre del Tema. Cuando se aplica mediante un StyleSheetTheme, las propiedades del Tema pueden ser sobreescritas por los controles de la Pgina. El siguente ejemplo muestra el Tema del ejemplo anterior aplicado como un StyleSheetTheme. Observad que la propiedad ForeColor definida en la pgina gana frente la definicin del Tema, de forma que ahora el control "Label" se representa azul. C# Las Propiedades de la Pgina Sobreescriben los StylesheetThemes

Prioridad de Tema y StyleSheetTheme Un StyleSheetTheme se supone que est hecho para ser aplicado durante el desarrollo de la aplicacin, como medio para factorizar nuestra informacin de estilo en las pginas y as mantener el comportamiento de la aplicacin separado del aspecto de la aplicacin. Podemos querer aplicar Temas a una aplicacin a la que ya hemos aplicado un StyleSheetTheme. Si aplicamos tanto un Tema como un StyleSheetTheme a un aplicacin, las propiedades de los controles se aplican en el siguiente orden:

Las propiedades StyleSheetTheme se aplican primero Las propiedades del Control en la pgina se aplican (sobreescriben StyleSheetTheme) Las propiedades de Tema se aplican en ltimo lugar (sobreescribiendo tanto las propiedades de control como StyleSheetTheme)

El siguiente ejemplo muestra el orden de prioridad descrito arriba.

C#

Prioridad

de

Temas

StylesheetThemes

Soporte de Visual Web Developer Visual Web Developer incluye soporte en tiempo de diseo para StyleSheetThemes. Cuando se aplica un StyleSheetTheme a una pgina, la Vista de Diseo en Visual Studio refleja la aplicacin del StyleSheetTheme en la previsualizacin de la representacin de los controles. Tambin podemos elegir en la lista de valores disponibles de SkinID para un control mediante la eleccin de la opcin -- en el panel inteligente de tareas del control (slo soportado para ciertos controles). El dilogo de Auto Formato muestra la lista de valores permitidos de SkinID en el StyleSheetTheme con una previsualizacin del control con el skin que hemos elegido. Cuando elegimos aplicar uno de estos valores, el diseador mantiene la propiedad SkinID del control.

Contenidos de un Tema y Skin Cmo se ha mostrado en las secciones anteriores, un fichero de Skin contiene las definiciones de controles con los valores de las propiedades que aplicaremos a los controles del mismo tipo en una aplicacin. Esta seccin discute detalles adicionales sobre qu es contenido vlido para aadir a un fichero de skin o de Tema. Propiedades Tematizables Las definiciones de controles en un fichero de skin slo pueden contener valores para propiedades que estn marcadas como Tematizables. Cada control define un conjunto de propiedades que podran ser tematizadas mediante ThemeableAttribute en la propiedad. Aadiendo una propiedad que no es tematizable a un fichero de skin produce un error. Un control por si mismo puede ser excluido de un Tema, por ejemplo los controles de fuente de datos no son tematizables. Por defecto, la ID de la propiedad no se puede tematizar para ningn control. Todas las propiedades son tematizables por defecto a no ser que un

control especifique lo contrario. Para comprobar si cierta propiedad es tematizable en un control, acudid a la documentacin de referencia del Framework .NET. Utilizando CSS en Temas Una Hoja de Estilos en Cascada (CSS) puede ser aadido a un Tema colocndolo bajo el subdirectorio del Tema. La hoja de estilos CSS se aplicar a todas las pginas a las que apliquemos el tema, siempre que la pgina tenga un control <head runat="server"/> definido. Podemos nombrar el fichero CSS de cualquier forma siempre que tenga la extensin .css. Un Tema puede contener mltiples ficheros CSS. Cuando la pgina contiene referencias a los ficheros CSS (mediante una etiqueta <link rel="stylesheet" href="..."/> en el elemento <head/>), cualquier fichero CSS del Tema se aplicara despues de las hojas de estilo de la pgina. C# Hojas de Estilo CSS Stylesheets en Temas

Utilizando Imgenes en Temas Un tema tambin puede contener imgenes que se referencian en la definicin del control en el fichero de skin. Las referencias a las imgenes en skins deben utilizar rutas relativas a la carpeta de las imgenes dentro del directorio Theme, de forma que las imgener y el fichero skin se puede mover juntas a otras aplicaciones de forma sencilla. En tiempo de ejecucin, las rutas a las imgenes se revisan, de forma que las referencias son relativas al control dentro de la pgina objetivo, en lugar de al fichero skin. El siguiente ejemplo muestra un tema con un subdirectorio de imgenes. C# Imgenes en Temas

Tematizando Grupos de Controles La mayora de las propiedades que establecemos en un skin sern propiedades de valor simple, como por ejemplo Font-Name, Width y BackColor. Sin embargo, tambin podemos crear un skin de propiedades de grupo. Haciendo sto no aplicamos propiedades a los elementos en el grupo del control objetivo. En lugar de eso, reemplazamos el grupo en su totalidad al utilizar Temas y combinamos el grupo cuando utilizamos StyleSheetThemes. El siguiente ejemplo muestra el grupo Items de un control DropDownList definido en un fichero skin. C# Tematizando Propiedades de Grupos

sto tambin es muy til para ciertas propiedades de grupos que contienen grupos de estilos, como la propiedad LevelStyle del control TreeView o las propiedades LevelMenuItemStyles, LevelSubMenuItemStyles o LevelSelectedStyles del control Menu. C# TreeView LevelStyles en un Tema

Tematizando Plantillas de Controles tambin podemos aplicar propiedades de plantillas en un fichero skin. Igual que los grupos, definir una propiedad de plantilla en un fichero skin no tematiza los elementos individuales dentrol de la plantilla del control objetivo, sino que reemplaza todos los contenidos de la plantilla. sto es til para cambiar de forma dramtica el diseo de un control que sigue una plantilla mediante la aplicacin de un Tema o un StyleSheetTheme.

C#

Tematizando

Propiedades

de

Plantillas

DataBindings y Expresiones observad que el enlazado a datos mediante <%# Eval %> o <%# Bind %> tambin son vlidas en una plantilla de tema, aunque los enlazados a datos en cdigo arbitrario no estn permitidos. C# Data Bindings in Themes

Temas y Perfiles Puede que queramos que los usuarios finales de nuestra aplicacin puedan escoger y aplicar Temas de forma dinmica. Almacenando el Tema activo en un Perfil de Usuario podemos aplicar dinmicamente un tema basado en las preferencias de usuario. Para hacer sto, aplicamos el tema mediante cdigo en lugar de fijar el Tema declarndolo en la directiva @Page o Web.config. Asignando un Tema Mediante Cdigo Para aplicar un Tema desde el cdigo, estableceremos la propiedad Theme del objeto Page en tiempo de ejecucin. Un tema debe ser aplicado a la pgina muy propnto en el ciclo de vida de una peticin, en el evento PreInit. El siguiente ejemplo muestra un Tema aplicado dinmicamente en este evento cuando el usuario selecciona un nombre de Tema en un control DropDownList. C# Asignando un Tema en Cdigo

Utilizando la caracterstica de Perfiles en ASP.NET 2.0 podemos almacenar las preferencias de usuario respecto a un Tema y reestablecerlas cuando el usuario se registra en nuestro sitio. El ejemplo que veremos a continuacin muestra esta tcnica. El usuario puede seleccionar su preferencia favorita de color y salvarla en su perfil, y la pgina establece el Tema basado en esta preferencia de color obteniendo el nombre del Tema del objeto Profile. Observad que si el usuario cierra la sesin en el sitio, el Tema vuelve al que tenemos por defecto (no hay Tema) pero si vuelve a iniciar sesin, la preferencia de usuario se mantiene. C# Asignando un Tema Basado en un Perfil de Usuario

Creacin de un Diseo Mediante Master Pages Lo Nuevo en 2.0

Master Pages (Pginas Maestras) - La caracterstica de las "Master Pages" nos proporciona la habilidad de definir una estructura y unos elementos de interfaz comunes para nuestro sitio, tales como la cabecera de pgina o la barra de navegacin, en una ubicacin comn denominada "master page", para ser compartidos por varias pginas del sitio. sto mejora la mantenibilidad de nuestro sitio y evita la duplicacin innecesaria de cdigo para estructuras o comportamientos del sitio que son compartidos.

Esta seccin habla de la caracterstica de las "Master Pages" en ASP.NET 2.0.

Al igual que los Temas y Skins nos permiten factorizar las definiciones de estilo para el cdigo de nuestra pgina y mantenerlos en un fichero comn, las Master Pages o Pginas Maestras nos permiten lo mismo para el diseo de la pgina. Una Master Page es una pgina que contiene marcas y controles que deben ser compartidas a travs de pginas mltiples de nuestro sitio. Por ejemplo, si todas

las pgins deben tener los mismos banners de cabecera y pie de pgina o el mismo men de navegacin, podemos definir sto en una Master Page una vez, de forma que todas las pginas asociadas a dicha Master Page heredarn estos elementos comunes. La ventaja de definir la cabecera, el pie de pgina y la navegacin en una Master Page es que estos elementos slo tendrn que ser definidos una vez, en lugar de muchas veces y en cdigo duplicado en las diferentes pginas del sitio. Master Pages y Content Pages La definicin de una Master Page es como la de cualquir pgina. Las Master Pages pueden contener marcar, controles, cdigo o cualquier combinacin de estos elementos. Sin embargo, una Master Page puede contener un tipo especial de control llamado ContentPlaceHolder. Un ContentPlaceHolder define una regin de la representacin de la master page que puede substituirse por el contenido de una pgina asociada a la maestra. Un ContentPaceHolder tambin puede contener contenido por defecto, por si la pgina derivada no necesita sobreescribir este contenido. La sintaxis de un control ContentPlaceHolder es como sigue: <%-ContentPlaceHolder control <asp:contentplaceholder id="FlowerText" <%-ContentPlaceHolder <asp:contentplaceholder <h3>Welcome to </asp:contentplaceholder> with default id="FlowerText" my florist --%> runat="server"/> content --%> runat="server"> website!</h3>

Para diferenciar una Master Page de una pgina normal, la Master Page se guarda con una extensin .master. Una pgina puede derivar de una Master Page simplemente con definir un atributo MasterPageFile en su directiva Page, de la forma vista arriba. Una pgina que se asocia a una Master Page se llama Content Page (Pgina de Contenido) <%@ Page MasterPageFile="Site.master" %> Una Content Page puede declarar controles Content que sobreescriban

especficamente el contenido de las secciones marcadas en la Master Page. Un control Content se asocia a un control ContentPlaceHolder particular a travs de la propiedad ContentPlaceHolderID. Una Content Page debe contener marcas y controles slo dentro de los controles Content; no puede tener ningn contenido de alto nivel por si misma. Puede, sin embargo, tener directivas o cdigo del lado del servidor. <%@ Page MasterPageFile="Site.master" %>

<asp:content id="Content1" contentplaceholderid="FlowerText" runat="server"> With sunshine, water, and careful tending, roses will bloom several times in a season. </asp:content> <asp:content id="Content2" contentplaceholderid="FlowerPicture" runat="server"> <asp:Image id="image1" imageurl="~/images/rose.jpg" runat="server"/> </asp:content> El siguiente ejemplo muestra la relacin entre las Master Pages y las Content Pages. La Master Page define, en este caso, dos regiones ContentPlaceHolder llamadas FlowerPicture y FlowerText, con algo de contenido por defecto para dichas regiones. Las pginas individuales de contenido del sitio heredan el diseo comn de sitio y el "ambiente" de la Master Page, pero sobreescriben el contenido por defecto de las regiones ContentPlaceHolder con su propio contenido. Observad que la pgina Default.aspx del sitio no define ningn control Content, de forma que heredo el contenido por defecto de la Master Page. C# Master Pages y Content Pages

"URL Rebasing" en Master Pages Una cosa a observar sobre los ejemplos anteriores es que hay varias pginas en una Master Page que hacen referencia a recursos URL, como imgenes, hojas de estilo o referencias a pginas, mediante la sintaxis de rutas relativas, por ejemplo: <head>

<link rel="stylesheet" href="StyleSheet.css" type="text/css" /> </head> ... <a href="daffodil.aspx">Daffodil</a> ... <img alt="water lilies" src="Images/waterlilies.jpg"/> sto funciona cuando la Master Page y la Content Page se encuentran en el mismo directorio, pero cuanto la Content Page se encuantra en una ubicacin distina, la ruta relativa no ser correcta. Para solucionar este problema, podemos escoger una de las siguientes propuestas:

Utilizar rutas URL absolutas en la Master Page, por ejemplo <img src="/myapplication/images/banner.gif" /> Utilizar URLS relativas o URLs relativas de aplicacin en los controles de servidor en lugar de marcas estticas, por ejemplo <asp:Image ImageUrl="~/images/banner.gif" runat="server" />

El siguiente ejemplo muestra esta tcnica. Las Pginas de Contenido han sido movidas el subdirectorio "Pages" bajo el directorio que contiene la Pgina Maestra. La Pgina Maestra se ha actualizado para utilizar controles de servidor en lugar de HTML: <head runat="server"> <link rel="stylesheet" href="StyleSheet.css" type="text/css" /> </head> ... <a id="A1" href="pages/daffodil.aspx" runat="server">Daffodil</a/> ... <asp:Image ID="Image1" AlternateText="Water Lillies" ImageUrl="~/Images/Waterlilies.jpg" runat="server"/> C# Mapeo de URL en Master Pages

Accediendo a una Master Page desde Cdigo Adems de sobreescribir el contenido, es posible que la Content Page acceda de forma programada a su Master Page. Una Content Page crea una referencia fuertemente tipada a la Master Page mediante la directiva <%@ MasterType %>, especificando la ruta virtual de la pgina maestra: <%@ MasterType VirtualPath="Site.master" %> Por lo tanto, la Content Page puede referenciar la Master Page mediante la propiedad Master de la clase Page: Master.FooterText = "This is a custom AdRotator ad = (AdRotator)Master.FindControl("MyAdRotator"); footer";

En el ejemplo de cdigo anterior, FooterText es una propiedad publica expuesta en la Master Page, mientras que MyAdRotator es un control de la Master Page. El siguiente ejemplo muestra este cdigo en accin: C# Accessing Master Pages in Code

Anidando Master Pages Las Content Pages tambin pueden ser Master Pages. sto quiere decir que es posible derivar una Master Page a partir de otra Master Page. Por ejemplo, podramos tener una Master Page de primer nivel que represente la cabecera/pie de pgina y la navegacin global del sitio, y despus Master Pages separadas que deriven de esta Master para definir los aspectos de las diferentes sub-secciones del sitio. Las Content Pages derivarn de la pgina maestra correspondiente a la seccin a la que pertenece la Content Page. El siguiente ejemplo muestra esta idea, dividiendo el sitio de ejemplo de en dos secciones, Annuals y Perrennials. C# Nested Master Pages

Creando la Jerarqua de Navegacin del Sitio

Lo Nuevo en 2.0:

Proveedor de Navegacin del Sitio: El proveedor de navegacin del sitio en ASP.NET 2.0 muestra la informacin de navegacin de las pginas en nuestra aplicacin, permitindonos definir la estructura de nuestro sitio de manera separada al diseo real de las pginas. El proveedor de navegacin del sitio est basado en XML, pero podemos mostrar esta informacin desde cualquier backend escribiendo un proveedor personalizado para los mapas del sitio.

API de la Navegacin del Sitio: El API de la navegacin del sitio permite el acceso a la informacin de navegacin desde nuestra aplicacin, abstrayendo los detalles de donde es almacenada sta informacin. Podemos usar el API para que desde el cdigo de nuestra aplicacin podamos recorrer los nodos de la navegacin.

Controles de Navegacin: Los controles de navegacin proveen una Interfaz de Usuario comn para navegar entre las pginas de nuestro sitio, como rboles, menus y caminos de navegacin. Estos controles usan el servicio de navegacin del sitio de ASP.NET 2.0 para recuperar la estructura que hayamos definido en nuestro sitio. El control SiteMapDataSource tambin d la posibilidad de enlazar otros controles a los datos de navegacin del sitio.

Esta seccin explica stas y otras caractersticas presentes en ASP.NET 2.0

Frecuentemente, los sitios Web necesitan mostrar una esquema de navegacin para guiar al usuario en el sitio. Las caractersticas de navegacin de ASP.NET, permiten a los desarrolladores definir fcilmente los datos de navegacin y mostrar una Interfaz de Usuario basada en esta informacin. El API de la Navegacin del Sitio, es una abstraccin programada para el acceso a los datos de la navegacin del sitio. Este API guarda los datos en un archivo

XML y muestra estos datos como una coleccin de clases del tipo SiteMapNode. Los desarrolladores de aplicaciones y controles pueden utilizar instancias de la clase SiteMapNode y usar esta informacin para generar la interfaz de navegacin. Los controles de servidor orientados a la navegacin son Menu, TreeView, SiteMapPath y SiteMapDataSource. Estos controles estn desarrollados en base a las clases destinadas a la navegacin del sitio y pueden utilizar y mostrar datos de navegacin sin una dependencia de la fuente de stos datos. Los controles Menu y Treeview tambin pueden utilizar datos desde archivos XML y del control XMLDataSource. La caracterstica de mapeo de Url permite a los desarrolladores definir reglas simples para re-escribir URLs. NOTA: Muchas gracias a Alejandra por su ayuda en la traduccin de este captulo.

Usando controles de Navegacin del Sitio Usando controles de Navegacin del Sitio Los controles Menu, TreeView, SiteMapPath y SiteMapDataSource generan una interface de usuario (IU) de navegacin basada en los datos de navegacin. Estos datos pueden ser almacenados en archivos XML, o usando las capacidades de almacenamiento de la Navegacin del Sitio. Los ejemplos de abajo muestran como usar estos controles en forma conjunta con la caracterstica de Navegacin del Sitio. Creando el mapa del sitio de una aplicacin Las estructuras de navegacin para los ejemplos de Inicio Rpido se representan en ficheros Web.sitemap. En este fichero sitemap, que podemos ver un poco ms abajo, se muestra la estructura de navegacin de todo el tutorial de inicio rpido de ASP.NET. Un fichero Web.sitemap contiene un solo elemento <siteMap> en el nivel ms alto. Anidado dentro del elemento <siteMap> hay por lo menos un elemento <siteMapNode>. Siempre tiene que haber al menos un <siteMapNode> dentro del mapa del sitio. La caracterstica de Navegacin de Sitio requiere de un

solo <siteMap> para asegurar que al movernos haca arriba en una jerarqua de nodos se garantiza que todo ello converge a un nico y conocido nodo. Podemos anidar tantos elementos <siteMapNode> por debajo del elemento <siteMap> como necesitemos. <siteMapNode> De forma adicional podemos como anidar tantos elementos queramos.

Un slo elemento <siteMapNode> contiene normalmente los atributos Url, Title y Description. El atributo Url puede indicar un camino virtual que corresponde a una pgina dentro de nuestra aplicacin. Tambin puede contener caminos a las pginas de otras aplicaciones o URLs que apuntan a sitios web completamente diferentes. En el siguiente ejemplo todos los atributos Url utilizan una sintaxis relativa para hacer referencia a caminos que se encuentran dentro de la aplicacin del Tutorial de Inicio Rpido de ASP.NET. El atributo Title se utiliza como texto a mostrar cuando se representa la Interfaz de Usuario (UI) para los datos de navegacin. Por ejemplo, el control SiteMarPath utiliza el atributo Title para mostrar el texto de los hiperenlaces en el control. Si se encuentra el atributo Description, los controles de servidor pueden utilizar esta informacin para mostrar tooltips o texto ALT. Un desarrolador tambin puede aadir atributos personalizados a <siteMapNode>, los cuales se encontrarn accesibles mediante el indexador por defecto de la clase SiteMapNode. Para ms informacin sobre otros atributos soportados por el elemento <siteMapNode> os remitimos a la documentacin del Framework .NET.

Ejemplo

de

Web.sitemap

Utilizando los Controles de Navegacin de Sitio Una forma fcil de proporcionar la navegacin de sitio en nuestrar pginar web es utilizar uno de los controles de navegacin de sitio grficos:SiteMapPath, TreeView and Menu.

SiteMapPath: un camino de navegacin que devuelve la pgina en la que se encuentra el usuario y muestra la jerarqua de pginas. Esto permite a los usuarios volver a otras pginas de la jerarqua. SiteMapPath trabaja de forma exclusiva con el SiteMapProvides que se puede establecer mediante la propiedad SiteMapProvider del control.

TreeView: Proporciona la interfaz de usuario para expandir o contraer los nodos seleccionados en una pgina web as como la funcionalidad de check box para los elementos seleccionados. El control TreeView soporta el establecimiento de pelementos de datos o de controles de la fuente de datos mediante cdigo o de forma declarativa. Si utilizamos el control SiteMapDataSource, el enlazado a datos ser automtico.

Menu: Proporciona una Interfaz de usuario horizontal o vertical que muestra submens adicionales cuando un usuario se pone sobre un elemento. El control Menu soporta la fijacin de los elementos de datos y de controles de fuente de datos de forma declarativa o mediante cdigo. Si utilizamos el control SiteMapDataSource, el enlazado a datos ser automtico.

NOTA: Tanto el control TreeView como el control Menu se pueden utilizar para escenarios que no son de navegacin.

Aqu tenemos una tabla en la que se resaltan algunas de las diferencias que hay entre los controles TreeView y Menu, que nos puede ayudar a elegir el control adecuado para nuestro escenario particular. Caracterstica Expansin Descarga demanda Checkboxes Plantillas Menu PopOut bajo No TreeView Expansin en el propio lugar S

No S

S No

Diseo Opciones de Estilo Modelo de Seleccin

Horizontal & Vertical S Nivel Esttico y Dinmicol

Vertical S Nivel o Padre/Root/Hoja, or por elemento de datos

En el siguiente ejemplo pordemos ver los controles TreeView y Menu con varias propiedades de estilo configuradas para diferentes reas y acciones (por ejemplo NodeStyle y HoverNodeStyle). Los controles TreeView y Menu se conectan al control SiteMapSource de la pgina. El control SiteMapPath accede a los mismos datos a travs del SiteMapProvider por defectro, que se establece en el fichero Web.config. C# Controles de Navegacin

Utilizando el API de Navegacin de Sitio API de Navegacin del Sitio es una entidad abstracta de programacin para los datos de navegacin que accedan a datos de navegacin usando proveedores configurables. Un proveedor de navegacin de sitio separa los detalles de almacenamiento de los datos de navegacin del resto de la API. La API de Navegacin del Sitio muestra los datos de navegacin a travs de las clases SiteMap y SiteMapNode. La clase SiteMap regresa una instancia SiteMapNode que corresponde a la pgina actual. Tambin proporciona acceso al proveedor(es) que ha sido configurado para la caracterstica de Navegacin del Sitio. Un SiteMapProvider tiene una API rica para realizar las siguientes tareas:

Devolver instancias SiteMapNode basadas en el contexto actual del HttpContext actual, o basado en un URL arbitrario. Devolver el nodo padre o los nodos hijos de un SiteMapNode.

Acceder el SiteMapNode de la pgina actual, as como tambin el SiteMapNode para toda la jerarqua de navegacin. Forzar las reglas de autorizacin para que slo los nodos visibles para el usuario sean devueltos por el proveedor.

Una instancia SiteMapNode expone funcionalidad e informacin de navegacin bsicas, incluyendo:

Las propiedades URL, ttulo, y descripcin estn disponibles tambin as como cualquier atributo personalizado que el desarrollador haya aadido al SiteMapNode

Obtener el padre de un nodo as como tambin sus nodos hijos Navegar a travs de los nodos hermanos antes y despus de un nodo Obtener una referencia a la instancia SiteMapProvider la cual devuelve un nodo

ASP.NET viene con un proveedor llamado XmlSiteMapProvider. Este proveedor consume datos de un archivo XML (web.sitemap) y devuelve instancias SiteMapNode basadas en sus datos. El XmlSiteMapProvider tambin tiene la siguiente funcionalidad:

Mltiples archivos sitemap que pueden ser vinculados juntos para formar un conjunto "virtual" sencillo de datos de navegacin Mltiples instancias XmlSiteMapProvider pueden ser vinculadas juntas para formar un set virtual sencillo de datos de navegacin El proveedor puede opcionalmente filtrar los nodos devueltos basandose en las reglas de autorizacin del archivo y la autorizacin del URL que actualmente se aplican al sitio web

Cuando tenemos una referencia al SiteMapProvider, podemos buscar los datos de navegacin de sitios para un nodo especfico basado en el URL. Esto nos permite obtener referencias a las instancias SiteMapNode en cualquier lugar en nuestros datos de navegacin del sitio. La combinacin de encontrar arbitrariamente instancias SiteMapNode y la habilidad de navegar a travs de los

datos de navegacin de sitios de cualquier SiteMapNode nos permite fcilmente moverte a travs de los datos de navegacin de tu sitio. Como desarrolladores, podemos escoger guardar los datos de navegacin en otros almacenes de datos utilizando otros formatos (por ejemplo como datos relacionales en una base de datos). Podemos entonces crear un proveedor personalizado que se derive de SiteMapProvider. <!--[if !supportLineBreakNewLine]--> Creando un Mapa de Aplicacin del Sitio Las estructuras de navegacin para los ejemplos del Inicio Rpido de la Navegacin de Sitios son representados en archivos Web.sitemap. En el archivo sitemap que podemos ver abajo, se muestra toda la estructura para el Tutorial de Inicio Rpido. Un archivo Web.sitemap contiene en el nivel ms alto un slo elemento <siteMap>. Anidado dentro del elemento <siteMap> encontramos, al menos, un elemento <siteMapNode>. Siempre debe de haber un <siteMapNode> en el nivel superior dentro del mapa del sitio. La caracterstica de Navegacin de Sitios requiere un solo elemento raz <siteMapNode> para asegurar la convergencia a un nico y conocido nodo al movernos por la jerarqua de nodos. Podemos anidar tantos elementos <siteMapNode> bajo el elemento raz <siteMapNode> como sean necesarios. Adicionalmente, podemos anidar elementos <siteMapNode> a cualquier profundidad arbitraria. Un elemento individual <siteMapNode> normalmente contiene los atributos Url, Title y Description. El atributo Url puede indicar el path virtual que corresponde a una pgina en nuestra aplicacin. Tambin pueden contener paths a pginas en otras aplicaciones, o URLs que apunten a sitios web completamente diferentes. En el ejemplo de abajo, todos los atributos Url usan sintaxis relativa a la aplicacin para hacer referencia a paths localizados dentro de la aplicacin QuickStart. El atributo Title es usado para mostrar texto cuando se muestra la UI para los datos de navegacin. Por ejemplo, el control SiteMapPath usa el atributo Title para mostrar el texto de los hipervnculos del control. Si el atributo Description se encuentra presente, los controles de servidor pueden usar esta informacin para

mostrar tooltips o texto altenativo. Un desarrollador pueden tambin agregar atributos personalizados a un <siteMapNode> y todos estos atributos estarn disponibles usando el indexador por defecto en la clase SiteMapNode. Para informacin en otros atributos soportados en el elemento <siteMapNode> por favor vea a la documentacin del Framework de .NET. Ejemplo Web.sitemap

Programando con las Clases de Navegacin de Sitios Podemos obtener datos de la navegacin del sitio programticamente en cdigo. El punto de inicio para obtener los datos de la Navegacin del Sitio programticamente es la clase SiteMap. Hay una variedad de mtodos estticos en esta clase, de los cuales es ms importante es la propiedad CurrentNode. En cualquier pgina de nuestro sitio web podemos llamar a SiteMap.CurrentNode para referenciar la parte de los datos de navegacin que concuerde con la pgina que actualmente se esta ejecutando. Los datos de Navegacin son devueltos como una instancia de un SiteMapNode - cuando llamamos a SiteMap.CurrentNode la propiedad devuelve una instancia SiteMapNode correspondiente a la pgina actual. La caracterstica de Navegacin de Sitio determina el nodo correcto a devolver basandose en datos de navegacin que son almacenados en un archivo XML. El siguiente ejemplo demuestra un control de usuario con paginacin simple. En la pgina que se muestra, el control de usuario se sita en el centro inferior de la pgina. Inicialmente existe un link [Next Topic]. Cuando se da clic sobre este link, el control de usuario llama al objeto SiteMap para determinar si existen pginas hermanas a la actual. Desde la propiedad SiteMap.CurrentNode, el cdigo determina si hay pginas hermanas previas (SiteMap.CurrentNode.PreviousSibling) as como determina si hay pginas hermanas a continuacin (SiteMap.CurrentNode.NextSibling). Basado en la existencia de pginas hermanas, el control de usuario muestra hipervnculos,

fijando la propiedad NavigateUrl de cada hipervnculo al valor de la propiedad Url del nodo hermano. Si hacemos clic en varios vnculos del TreeView en el lado izquierdo de la pgina, tambin podremos observar que el control de usuario automticamente despliega los vnculos [Next Topic] y [Previous Topic] apropiados. El control de usuario tambin muestra un hipervnculo en el cual podemos hacer clic para regresar a la pgina de inicio. Si observamos el cdigo y ves como este hipervnculo se muestra, el control usa un atributo personalizado del elemento <siteMapNode> de la pgina de inicio llamado "customAttribute". El control muestra como usar el indexador por defecto de SiteMapNode para devolver el valor de este atributo personalizado. C# SiteMap API

Seguridad en la Navegacin de Sitio La caracterstica de Navegacin de Sitios puede, opcionalmente, filtrar las instancias SiteMapNode devueltas por un proveedor basados en reglas de autorizacin. El XmlSiteMapProvider puede filtrar nodos basandose en el archivo y las reglas de autorizacin de URL que se apliquen al sitio web actual. El siguiente ejemplo usa autenticacin basada en formularios con credenciales de usuario predefinidas guardadas en el archivo web.config. En global.asax, los roles se adjuntan a la peticin actual basandose en el nombre de usuario. En el archivo web.config, el elemento <add> anidado dentro del elemento <siteMap> tiene el valor de su atributo securityTrimmingEnabled attribute fijado a true. El archivo web.config tambin define un nmero de reglas de autorizacin de URLs al final del archivo. Cuando ejecutamos el ejemplo y nos autenticamos, el XmlSiteMapProvider automticamente realizar una comprobacin de la

autorizacin para cada SiteMapNode, basada en la combinacin de roles a los que el usuario pertenece y en las reglas de autorizacin definidas en el archivo web.config. Prueba a ejecutar el ejemplo con una de las siguientes cuentas de usuario:

Userid: SectionOne Userid: SectionTwo Userid: AllSections

Password: SectionOne Password: SectionTwo Password: AllSections

Hay un enlace de cierre de sesin en la esquina superior derecha de la pgina para que podamos iniciar o cerrar sesin con cuentas diferentes. Observad como dependiendo de cual sea la cuenta que utilicemos para autenticarnos, la interfaz de navegacin desplegada en los controles TreeView y Menu automticamente cambia para reflejar las URLs a los que cada usuario est autorizado a acceder. El proveedor automticamente filtra y devuelve los nodos - no se require de cdigo extra para este comportamiento. Autenticarse como un usuario "SectionOne" hace que slo se muestren vnculos para "SectionOne" y vnculos externos en el control TreeView de la parte izquierda. Autenticarse como un usuario "SectionTwo" hace que se muestren vnculos para "SectionTwo" y vnculos externos en el control TreeView de la parte izquierda. Autenticarse como un usuario "AllSections" despliega todos los vnculos en el control TreeView. Las reglas de autorizacin en el archivo web.config son configuradas para otorgar acceso de forma selectiva a las jerarquas de los URLs de "SectionOne" y "SectionTwo" Este ejemplo tambien muestra como funciona la seguridad con URLs que se encuentran fuera del alcance del directorio de una aplicacin. En el archivo web.sitemap el atributo roles es usado en los nodos para vnculos externos. La sntaxis roles="*" otorga a todos los usuarios el derecho de obtener y ver cada nodo en los controles de navegacin. La sntaxis roles="Adminstrators,Regular Users" permite solamente a los usuarios en estos roles el derecho de obtener y ver los nodos en los controles de navegacin. Debido a que el archivo global.asax

asigna usuarios en este ejemplo a uno de estos dos roles, seremos siempre capaces de ver los vnculos externos. Los desarrolladores tienen la opcin de usar las reglas de autorizacin de archivo/URL y el atributo roles para controlar el acceso a instancias de SiteMapNode. Si ambos grupos de informacin se encuentran disponibles, un proveedor de navegacin de sitios tratar de autorizar al usuario actual basado en ambos: en las reglas de autorizacin de archivo/URL y en los roles dentro del atributo roles. Si el usuario actual pasa cualquier grupo de verificacin de autorizacin, entonces al usuario actual se le otorgar acceso al nodo. Si el comportamiento de seguridad por defecto no es conveniente para nuestra aplicacin, un desarrollador puede derivar de XmlSiteMapProvider y sobrecargar el mtodo IsAccessibleToUser con una implementacin personalizada para la autorizacin de los nodos.

C#

Seguridad

en

la

Navegacin

de

Sitios

Localizando los Datos del Mapa de Sitio Los datos de navegacin son almacenados en un archivo sitemap puede necesitar localizarse. Los atributos URL, Title y Descripction en un elemento <siteMapNode> pueden ser localizados. Adems, cualquier atributo personalizado que un programador coloque en un elemento <siteMapNode> El ejemplo incluye texto para los lenguajes Ingls y Francs. El archivo web.sitemap usa dos tipos de expresiones de localizacin para lograr esto: Expresiones implcitas y expresiones explcitas. Para ms detalles de Expresiones de Localizacin en general, as como informacin a fondo de los dos tipos de expresiones de localizacin visita el tema Localizando tu Aplicacin en el Tutorial

de Inicio Rpido. Un archivo sitemap indica que usa datos de localizacin por la existencia de enableLocalization=true en la raz del elemento sitemap. En un archivo sitemap las expresiones implcitas hacen ms fcil para un desarrollador el etiquetar cada elemento <siteMapNode> con una llave de bsqueda que ser usada para retornar recursos desde un archivo de recursos. En el ejemplo web.sitemap, las expresiones de recursos implcitas estn en cada nodo excepto en el primero. La sintaxis luce como sigue: resourceKey="Autos". Cuando el XmlSiteMapProvider obtiene un SiteMapNode basado en la informacin dentro del archivo web.sitemap, buscar una cadena de recursos basada en la combinacin del nombre de la propiedad SiteMapNode, la resourceKey y el valor del atributo siteMapFile configurado por el proveedor. Usando el nodo Autos como ejemplo, el proveedor buscar un archivo de recursos que empiece con web.sitemap basado en la cultura actual. Esto significa que si el navegador enva el encabezado con el lenguaje francs, entonces el proveedor buscar por un archivo de recursos llamado web.sitemap.fr.resx. En el archivo de recursos, el proveedor buscar una llave de recursos cuyo nombre se base en resourceKey + "." + [nombre de la propiedad SiteMapNode]. Usando la propiedad Title para el nodo Autos como ejejmplo, el proveedor buscar un recurso en el cual la llave es Autos.Title dentro del archivo de recursos llamado web.sitemap.fr.resx. Las expresiones explcitas otorgan al programador mayor control sobre los archivos que contienen recursos de localizacin as como el nombre de la llave de recurso. En el ejemplo web.sitemap, un recurso de expression explcita es utilizado por el primer elemento <siteMapNode>. Las Expresiones explcitas son especficadas en una base por-atributo. El primer elemento <siteMapNode> usa una expression explcita para el atributo Title. Una expresin explcita siempre debe iniciar con $resource:. Despus de este identificador, un desarrollador debe proveer el nombre raz para el archivo de recursos, as como para la llave de recurso.De forma opcional, el desarrollador puede proporcionar un valor por defecto. En el ejemplo, la expresin $resources: Title, MyTitle , Home indica al proveedor que debe buscar en un archivo de recursos que empieza por Title.

Para un navegador que enva un encabezado en idioma francs, el proveedor buscara por un archivo de recursos llamado Title.fr.resx. El proveedor entonces buscar por un recurso el cual su llave es MyTitle. Si el proveedor no puede encontrar tal recurso, volver a intentarlo usando la cadena Home como su valor por defecto. Para ver los efectos de la localizacin de mapas de sitios, ejecutad el ejemplo. A los navegadores que indican Ingls como el lenguaje por defecto se les devolver el texto en ingls. Si estis usando IE, podis cambiar el lenguaje por defecto yendo a Herramientas --> Opciones de Internet y seleccionando el botn de Lenguajes en la pestaa General. Presionad el botn Agregar y escoge aadir el lenguaje Francs (Francia) [fr] como un lenguaje. Si es necesario, seleccionad la opcin para el lenguaje Francs y presionad Mover Arriba para hacerlo el lenguaje por defecto solicitado por IE. Despus de cambiar el lenguaje default a francs, refrescad la pgina de muestra. Observad que el texto en los controles Menu, TreeView y SiteMapPath automticamente cambia para reflejar el texto en francs almacenado en los archivos de recurso francs localizados en el directorio App_GlobalResources. C# Sitemap Localization

Modificando los Datos de Navegacin de Sitio Devueltos por los Proveedores Los datos de navegacin contenidos en web.sitemap consumidos por el XmlSiteMapProvider son estticos los datos se cargan en memoria y se almacenan como datos de solo-lectura. Sin embargo, muchos sitios tienen una estructura de navegacin que es parametrizada y est basado en valores querystring. Por ejemplo, un sitio de grupo de noticias puede tener una estructura bien definida de pginas (ejem. Una pgina inicial, una pgina de categoras de noticias, y una pgina con el artculo de la noticia), pero el contenido real puede variar dependiendo de identificadores del querystring. Aunque es posible guardar

cualquier cambio en los valores querystring en elementos <siteMapNode>, incluso para un nmero moderado de valores querystring, un archivo sitemap puede contener cientos de miles de elementos <siteMapNode>. La caracterstica de Navegacin de Sitios da acceso al evento SiteMapResolve de la clase base SiteMapProvider. Una suscripcin al evento se puede hacer mediante SiteMap.SiteMapResolve o directamente contra proveedores individuales usando SiteMap.Provider.SiteMapResolve. El valor devuelto por el evento es una instancia SiteMapNode. En tu manejador del evento puedes escribir lgica personalizada para crear una jerarqua de las instancias SiteMapNode. Esta lgica puede modificar las propiedades en cada SiteMapNode para que as las propiedades como URL y Title reflejen informacin adicional basada en los datos tomados del querystring. El siguiente ejemplo registra un manejador de eventos en in global.asax. El cdigo para el manejador de eventos est en una clase localizada dentro del directorio App_Code. La clase personalizada hace una copia de la instancia SiteMapNode correspondiente a la pgina actual. Debido a que los nodos de XmlSiteMapProvider son de slo lectura, llamando al mtodo Clone en un SiteMapNode retorna una instancia escribible del nodo. En el ejemplo se le enva un valor de true al mtodo Clone, lo que resulta en una copia escribible del actual SiteMapNode as como tambin de todos los padres el nodo. El resto del cdigo en la clase inspecciona la pgina actual y el querystring de la pgina actual para determinar en qu lugar de la jerarqua de sitios est ubicada la pgina actual. El cdigo arregla las propiedades URL y Title incluyendo informacin adicional para que la interfaz de navegacin mostrada por el control SiteMapPath refleje el path real que el usuario del sitio web por medio de clics ha seguido para llegar a la pgina actual. Cuando ejecutamos el ejemplo inicialmente estamos en la pgina de inicio del sitio. El control SiteMapPath reflejar esto tambin. Haciendo clic en cualquier otro de los vnculos nos llevar a la pgina de categora que desplegara vnculos a los artculos de noticias correspondientes a una categora de noticias especfica.

Observad que si nos posicionamos sobre el ultimo vnculo del control SiteMapPath, la URL que se despliega en la barra de estado del navegador incluye informacin del querystring especificando el tipo de categora de noticias. Hacer clic en uno de los vnculos posteados nos llevar a la pgina de noticias posteadas. Si nos posicionamos sobre uno de los vnculos del control SiteMapPath, observamos que los ltimos dos vnculos del control tienen URLs y Ttulos que contienen el querystring correcto e informacin descriptiva basada en el clickpath. Si navegamos de regreso a la pgina de inicio del sitio, tratad de dar clic el otro grupo de vnculos de noticias y contenidos, y de nuevo notamos como el control SiteMapPath se actualiza para reflejar el segundo grupo de vnculos en los cuales hicimos clic. C# Utilizando el Evento SiteMapResolve

Mapeo URL

La caracterstica de Mapero URL (URL Mapping) utiliza informacin de configuracin almacenada en web.config para redireccionar las peticiones entrantes a una URL diferente. El redireccionamiento se produce antes que cualquier otro procesamiento de peticiones entrantes. Aunque el siguiente ejemplo muestra el redireccionamiento de una peticin de una pgina, podemos redireccionar una peticin de cualquier tipo de fichero a una URL diferente. <a name="remapping"> Definiendo URL Redireccionadas La informacin de configuracin para el Mapeo URL se almacena en web.config. Cada elemento <add> anidado dentro del elemento <urlMappings> define una regla para redireccionar una url entrante. El atributo url define el valor exacto de la url entrante con la que la funcin de Mapeo URL tiene que intentar encajar. Si se produce una coincidencia, la URL entrante se reescribe con el valor del atributo mappedUrl. Observad que esta caracterstica no soporta ms reglas avanzadas como "widcards"o expresiones regulares. El web.config de ejemplo define reglas de mapeo para un nmero de urls. El fichero web.sitemap del ejemplo define la mayor parte de sus nodos con valores

de URL que sern redireccionadas. Como resultado, la combinacin del Mapeo URL y la Navegacin de Sitio permite a los desarrolladores definir una estructura de navegacin en trminos de urls "amistosas", mientras usamos Mapeo URL para reescribir peticiones a un grupo diferente de pginas que realizan un procesado real. Cuando ejecutis el ejemplo, observad cmo los controles Menu y TreeView muestran los datos de navegacin basndose en la estructura del sitio definida en el fichero web.sitemap. Si nos movemos sobre cualquiera de los enlaces del control TreeView o del control SiteMapPath de la esquina superior derecha, la url que se muestra en la barra de estado es una url "amistosa". Al hacer click sobre cualquiera de los enlaces de navegacin, la pgina real que se ejecuta es Default.aspx. Sin embargo, la informacin de navegacin en los controles Menu, TreeView y SiteMapPath continua mostrando una estructura de URL "amistosas". Al final de la pgina tambin podemos ver los valores devueltos por Request.Path, Request.QueryString["category"], and Request.RawUrl. Los valores de Request.Path y Request.QueryString["category"] siempre reflejan los resultados de redireccionar una url entrante. Sin embargo, el valor para Request.RawUrl muestra la url "amistosa" antes del redireccionamiento. La caracterstica de Navegacin de Sitio siempre utiliza Request.RawUrl cuando intenta comprobar la coincidencia entre la informacin de la url y los datos del fichero sitemap. Si no se encuentra ningn valor que coincida, el XmlSiteMapProvider utiliza Request.Path en su lugar. En este ejemplo, todas las url "amistosas" tienen una entrada en el fichero --, de forma que los controles que utilizan la Navehacin de Sitio siempre muestran y hacen referencia a nodos en la url "amistosa" C# mapeo Url

Asegurando Nuestra Aplicacin

Lo Nuevo en 2.0
o

Proveedores de miembros y manager de roles. ASP .NET 2.0 ahora incorpora soporte para miembros (almacenamiento de credenciales de usuario nombre/contrasea) y servicios de administracin de roles. Ya que todos estos servicios estn orientados a proveedor, pueden ser fcilmente cambiados y sustituidos por implementaciones a medida. Controles de registro. Los nuevos controles de registro proporcionan los complementos para aadir Interfaces de Usuario (UI) basadas en autentificacin y autorizacin (formularios de registro, de creacin de usuarios, de recuperacin de password y UI personalizadas para usuarios registrados o para determinados roles, etc) a nuestro sitio web. Estos controles usan los servicios de miembros y roles incorporados en ASP .NET para interactuar con el usuario y la informacin de rol definida para tu sitio web.

Esta seccin trata estas y otras caractersticas relacionadas con la seguridad en ASP .NET 2.0.

Una parte importante de muchas de las aplicaciones web es la posibilidad de identificar usuarios y el control de acceso a los recursos. El hecho de determinar la identidad de la entidad solicitante es conocida como autenticacin. Generalmente, el usuario debe presentar credenciales, como el par usuario/password para ser autenticado. Una vez una identidad autenticada est disponible debe determinarse si esa identidad puede acceder a un determinado recurso. Este proceso es conocido como autorizacin. ASP .NET trabaja conjuntamente con IIS para proporcionar servicios de autenticacin y autorizacin a las aplicaciones. Una caracterstica importante de los objetos COM es la habilidad de controlar la identidad bajo la cual el cdigo del objeto COM se ejecuta. Cuando un objeto COM ejecuta cdigo con la identidad de la entidad solicitante, esto es conocido como suplantacin. Las aplicaciones del Framework de ASP .NET opcionalmente pueden elegir suplantar las solicitudes.

Algunas aplicaciones tambin quieren ser capaces de adaptar contenidos dinmicamente, basandose en la identidad solicitante o en el conjunto de roles a los que la identidad solicitante pertenece. Las aplicaciones del Framework de ASP .NET pueden comprobar dinmicamente si la identidad solicitante forma parte o no de determinado rol. Por ejemplo, una aplicacin podra querer comprobar si el usuario pertenece al rol administradores para generar los contenidos de administrador La caracterstica de Miembros de ASP .NET facilita la creacin y administracin de usuarios. La carcterstica Miembros trabaja conjuntamente con otra nueva caracterstica llamada Administrador de Roles. El Administrador de Roles proporciona la infraestructura para la creacin de roles y la asignacin de usuarios a roles. Cuando se usan las caractersticas de Miembros y Administrador de Roles junto con los Formularios de Autenticacin, ASP .NET proporciona soporte completo para la creacin, autenticacin y autorizacin de usuarios. Tanto Miembros como el Administrador de Roles han sido diseados para proporcionar un modelo basado en proveedores. Los proveedores abstraen el almacn fsico de datos a las caractersticas desde las clases y la lgica de negocio expuesta por una caracterstica. Tanto Miembros como el Administrador de Roles trabajan con los proveedores en Microsoft SQL Server. Miembros tambin funciona con un proveedor que trabaja contra en Active Directory y Active Directory Application Mode (ADAM). El Administrador de Roles funciona con un proveedor adicional que trabaja con la caracterstica Administracin de Autorizaciones disponible en Windows Server 2003. Podemos crear nuestros propios proveedores y configurarlos para trabajar tanto con la caracterstica Miembros como Administrador de Roles. Los Controles de Registro son un conjunto de controles de servidor propios que proporcionan interfaces de usuario comunes para las tareas de autenticacin y autorizacin. Los Controles de Registro usan las funcionalidades de las caractersticas de Miembros, Administrador de Roles y Formularios de Autenticacin.

Autenticacin y Autorizacin ASP .NET trabaja conjuntamente con el IIS para el soporte de la autenticacin, utilizando autenticacin basada en Windows, Digest y Basic. ASP .NET admite el servicio de autenticacin Microsoft Passport, el cual proporciona un sencillo soporte y servicio de loggin para los servicios de perfiles. ASP.NET tambin proporciona un servicio robusto para aplicaciones que quieren usar autenticacin basada en formularios. La autenticacin basada en formularios utiliza cookies para autentificar usuarios y permite a la aplicacin hacer su propia verificacin de credenciales. Es importante darse cuenta de que los servicios de autenticacin de ASP .NET estn sometidos a los servicios de autenticacin ofrecidos por el IIS. Por ejemplo, para usar la autenticacin Basic en una aplicacin IIS, debes configurar el uso de dicha autenticacin utilizando la herramienta del Administrador de Servicios de Internet. ASP .NET proporciona 2 tipos de servicios de autorizacin:

Comprobacin sobre los ACLs (Listas de control de acceso) o sobre los permisos de un recurso para determinar si la cuenta de usuario autenticada puede acceder a dichos recursos.

Autenticacin por URL, la cual autoriza a una identidad por zonas en el espacio web.

Para ilustrar la diferencia, consideremos un escenario en el cual una aplicacin se configura para permitir acceso annimo mediante la cuenta IUSR_MYMACHINE. Cuando una peticin de una pgina ASP .NET (por ejemplo /default.aspx) es autorizada, se realiza una comprobacin contra la ACLs sobre dicho archivo (por ejemplo, c:\inetpub\wwwroot\default.aspx) para ver si la cuenta IUSR_MYMACHINE tiene permiso para leer ese archivo. Si es correcta, el acceso es autorizado. Si los contenidos de la web residen en un volumen NTFS, y la autorizacin de Windows se configura sobre el directorio virtual, la autorizacin de archivos de ejecuta automticamente.

Para la autenticacin por URL, el usuario annimo se comprueba contra los datos de configuracin calculados por la aplicacin ASP .NET. Si se permite el acceso a la URL solicitada, la peticin es autorizada correctamente. En este caso, ASP .NET comprueba si el usuario annimo puede acceder a /default.aspx (esto es, la comprobacin hecha contra la propia URL, no contra el archivo que la URL resuelve en ltima instancia). Puede parecer que apenas no hay diferencia, pero permite a las aplicaciones utilizar combinaciones de autenticacin como las basadas en formularios o autenticacin Passport, en las cuales los usuarios no corresponden a una maquina o una cuenta de dominio. Tambin permite autorizacin contra recursos virtuales, para los cuales no hay un archivo fsico subyacente al recurso. Por ejemplo, una aplicacin puede elegir mapear todas las peticiones para archivos que terminen en .stk a un manejador que atienda stock quotes basadas en variables presentes en el la cadena de peticin. En dicho caso, no hay un .stk fsico contra el que hacer una comprobacin ACL, de forma que se usa la autorizacin URL para controlar el acceso al recurso virtual. La autorizacin de archivos se ejecuta siempre contra la cuenta autenticada proporcionada por el IIS. Si se permite el acceso annimo, esta es la cuenta annima configurada. De lo contrario, usa una cuenta NT. Esto funciona exactamente de la misma forma que en ASP. El archivo ACL se configura para un archivo o un directorio dado utilizando la pestaa de Seguridad en la pgina de propiedades de Explorer. La autenticacin por URL se configura como parte del Framework de ASP .NET de una aplicacin y est totalmente descrita en Authorizing Users and Roles. Para activar un servico de autenticacin de ASP .NET, debes configurar el elemento <authentication> en el archivo de configuracin de la aplicacin. Este elemento puede tomar cualquiera de los valores listados en la siguiente tabla:

Valor None

Descripcin Ningn servicio de autenticacin ASP .NET esta activo. Observad que el servicio de autenticacin de IIS puede estar todava presente. Los servicios de autenticacin de ASP .NET adjuntan un WindowsPrincipal (System.Security.Principal.WindowsPrincipal) a la peticin actual para permitir la autorizacin contra grupos o usuarios de NT. Los servicios de autenticacin de ASP.NET gestionan las cookies y redireccionan a los usuarios no autenticados a una pgina de registro. Esto a menudo se usa conjuntamente con la opcin del IIS de permitir acceso annimo a la aplicacin. Los servicios de autenticacin de ASP.NET proporcionan un formato conveniente alrededor del servicio ofrecido por el Passport SDK, el cual debe estar instalado en la mquina.

Windows

Forms

Passport

Por ejemplo, el siguiente archivo de configuracin permite autenticacin basada en formularios (cookies) para una aplicacin: <configuration> <system.web> <authentication mode="Forms"/> </system.web> </configuration>

Autenticacin Basada en Formularios La autenticacin basada en formularios es un servicio de autenticacin de ASP .NET que permite a las aplicaciones proporcionar su propia Interfaz de Usuario para el inicio de sesin y hacer su propia verificacin de credenciales. ASP .NET autentica usuarios, redirecciona uusarios no autenticados a la pgina de inicio de sesin y ejecuta toda la administracin de cookies necesaria. Este tipo de autenticacin es una tcnica muy popular usada en muchos sitios web.

Para que una aplicacin utilice autenticacin basada en formularios, tendremos que fijar el valor de <authentication> a Forms, y denegar el acceso a usuarios annimos. El siguiente ejemplo muestra como puede realizarse esto en el fichero Web.config para la aplicacin deseada: <configuration> <system.web> <authentication mode="Forms"/> <authorization> <deny users="?" /> </authorization> </system.web> </configuration> Los administradores usremos la autenticacin basada en formularios para configurar el nombre de la cookie a utilizar, el tipo de proteccin, la URL de la pgina de login, tiempo de vida de la cookie y la ruta a utilizar para la cookie emitida. La siguiente tabla muestra los atributos vlidos para los elementos <Forms>, el cual es un subelemento de <authentication>, mostrado en el siguiente ejemplo: <authentication mode="Forms"> <forms name=".ASPXCOOKIEDEMO" loginUrl="login.aspx" defaultUrl="default.aspx" protection="All" timeout="30" path="/" requireSSL="false" slidingExpiration="true" enableCrossAppRedirects="false" cookieless="UseDeviceProfile" domain=""> <!-protection="[All|None|Encryption|Validation]" --> <!-- cookieless="[UseUri | UseCookies | AutoDetect | UseDeviceProfile]" --> </forms> </authentication>

Atributo cookieless

Descripcin Los formularios de autenticacin de ASP.NET 2.0 pueden almacenar los tickets de autenticacin de los formularios con o sin la representacin en la URL de una cookie. El valor por defecto de UseDeviceProfile

indica que ASP .NET determina dnde almacenar el ticket basado en el perfil del navegador pre-calculado. La opcin de AutoDetect hace que ASP.NET determine dinmicamente si el navegador soporta cookies o no. UseUri y UseCookies fuerza el uso de tickets sin y con cookies, respectivemente. defaultUrl Especifica la URL por defecto a la que la peticin es redireccionada despus de un ingreso vlido. Este valor se usa si no existe una URL de redireccin en la Autenticacin por Formularios. domain Especifica el valor de la propiedad Domain en la HttpCookie que contiene los tickets del formulario de autenticacin. Configurar este atributo explcitamente permite a las aplicaciones compartir la misma cookie siempre que las aplicaciones compartan una porcin comn de un espacio de nombres de DNS (ej: appA.contoso.com y appB.contoso.com podran compartir una cookie si el domain attribute tiene el valor "contoso.com"). enableCrossAppRedirects Los formularios de autenticacin de ASP.NET 2.0 permiten enviar los tickets de autenticacin del formulario entre aplicaciones tanto en una variable cadena-peticin como en una variable POST de formulario. Poner este atributo a true permite al FormsAuthenticationModule extraer el ticket tanto de una cadena-peticin como de una variable POST de formulario. loginUrl Especifica la URL a la cual la peticin es redireccionada para usuarios no autenticados. Esta puede estar en la misma mquina o una remota. Si est en una remota, ambas mquinas necesitan estar usando el mismo valor para los atributos decryptionkey y validationKey que se encuentran en el elemento de configuracin machineKey. name Nombre de la cookie HTTP a usar para propsitos de autenticacin. Observad que si ms de una aplicacin quiere usar servicios de autenticacin basados en formularios en una sla mquina, y cada aplicacin quiere que la cookie del formulario de autenticacin sea exclusiva para la aplicacin, entonces cada una debera configurar un nico valor de cookie. Para evitar causar dependencias en las URLs, ASP .NET tambin usa / como valor de Path cuando configura cookies de autenticacin, de modo que son devueltas a cada aplicacin en el sitio web.

path

protection

Path o ruta que usa la cookie emitida. El valor por defecto es / para evitar dificultades en caso de ausencia de path, debido a que los navegadores distinguen entre maysculas y minsculas cuando devuelven las cookies. Las aplicaciones en un entorno de servidor compartido deberan usar estas directivas para mantener las cookies privadas. (Alternativamente, pueden especificar el path en tiempo de ejecucin utilizando APIs para la cookie emitida). Mtodo usado para proteger los datos de las cookies. Los valores permitidos son los siguientes:

All: Usa tanto validacin como encriptacin para proteger la cookie. El algoritmo validacin de datos est basado en el elemento <machinekey>. Se usa AES por defecto para la encriptacin, y si la clave es suficientemente larga (48 caracteres). All es el valor por defecto (y aconsejado). None: Se usa para sitios que solo usan cookies para la personalizacin y tienen requerimientos de seguridad poco estrictos. Tanto la encriptacin como la validacin se pueden desactivar. Aunque se deberiamos tener cuidado si usamos las cookies de este modo, esta configuracin proporciona las mejores prestaciones de cualquier mtodo de personalizacin usando el Framework de .NET. Encryption: Encripta la cookie utilizando AES, TripleDES o DES, pero no se realiza una validacin sobre la cookie. Este tipo de coolie puede estar sujeta a determinados ataques choose plaintext. Validation: No encripta los contenidos de la cookie, pero valida el que los datos de la cookie no hayan sido alterados durante el trayecto. Para crear la cookie, la clave de validacin es concatenada en un buffer con los datos de la cookie y una MAC es calculada y aadida a la cookie de salida.

requireSSL

Si el valor est a true, la Autenticacin por Formularios configura el bit de seguridad en la cookie del formulario de autenticacin. Los navegadores

slidingExpiration

timeout

conformistas slo devolvern la cookie a ASP .NET a travs de una conexion SSL. Observad que esta configuracin no tiene efecto en formularios de autenticacin sin cookies. Si el valor est a true, los Formularios de Autenticacin actualizarn peridicamente el tiempo de vida para los tickets del formuario de autenticacin. Esto ocurre independientemente de si el ticket est o no contenido en una cookie, o en los formatos sin cookie en la URL. Cantidad de tiempo en minutes enteros, despus del cual la cookie expira. El valor por defecto es 30. El atributo timeout es un variable, que expira a los n minutos de haber recibido la ltima peticin. Para evitar prestaciones que nos afecten negativamente o mltiples avisos del navegador (para aquellos que tengan los avisos de cookier activados), la cookie se actualiza si el tiempo transcurrido es ms de la mitad del valor configurado. (Esto puede conllevar una prdida de precision en algunos casos).

Despus de que la aplicacin haya sido configurada, necesitamos proporcionar una pgina de registro. El siguiente ejemplo muestra una sencilla pgina de registro. Cuando se ejecuta el ejemplo, solicita la pgina Default.aspx. Las peticiones no autenticadas se redireccionan a la pgina de registro (Login.aspx), qu presenta un sencillo formulario solicitando una direccin de correo electrnico y un password. (Como credenciales utiliza Username=someone@www.contoso.com and Password=password). Despus de validar las credenciales, la aplicacin realiza la siguiente llamada: Personalizacin Mediante Elementos Web

Lo Nuevo en 2.0
o

Controles Elementos Web - Los Elementos Web son una apasionante nueva familia de controles que te permitirn aadir contenidos y diseos personalizados a nuestro sitio,as como la capacidad de editar el contenido y el diseo desde las pginas de nuestra aplicacin. Estos controles se basan en los servicios de personalizacin del ASP.NET 2.0 para proveer de una experiencia nica para cada uno de los usuarios de nuestra aplicacin. Cualquier control puede ser fcilmente convertido en un Elemento Web para participar en estos servicios de personalizacin.

Esta seccin describe lo nuevos Controles de Elementos Web en ASP.NET 2.0.

Los sitios Web modernos requieren frecuentemente IUs (Interfaces de Usuario) que sean dinmicas y personalizables. Los Usuarios de esos sitios pueden personalizar el diseo y la apariencia del contenido de las pginas de acuerdo a sus preferencias individuales y personalizar el contenido de la pgina para mostrar la informacin ms relevante. Tradicionalmente, construir esos sitios ha requerido de gran cantidad de cdigo complejo, desde la creacin de un cdigo seguro, una infraestructura de personalizacin comprensible en el servidor, hasta escribir un script del lado del cliente para ofrecer una rica experiencia de navegacin. ASP.NET 2.0 incluye un nuevo paquete de Elementos Web que hacen que sea muy sencillo crear pginas con diseo modular y dinmico y con contenido personalizado.

NOTA: Para usar los ejemplos de esta seccin, necesitaremos crear un usuario y contrasea para ingresar. La contrasea debe satisfacer los siguientes requerimeintos o ser considerada invlida:

Debe contener al menos 7 caracteres Debe contener al menos 1 caracter no alfanmerico (smbolos de puntuacin)

Ejemplos: test@123, out(in), far$ide

Muchas gracias a JC por su ayuda en la traduccin de este captulo.

Introduccin a los Controles Elementos Web El Conjunto de Controles Elementos Web incluye los siguientes controles:

Los WebPart son controles ASP.NET de servidor que pueden ser usados y personalizados con el Conjunto de Controles Elementos Web. Cualquier control de servidor o control de usuario puede comportarse como un WebPart.

Las WebPartZone proporcionan un modo de organizar partes dentro de regiones en la pgina. Las WebPartZone son controles contenedores que proporcionan capas para los WebPart y para aadir IU comunes, consistentes como un Men Verb y borde a cada WebPart.

El control WebPartManager maneja el estado de personalizacin de las pginas y coordina la comunicacin entre las partes y las zonas. Cada pgina que usa el paquete de Controles Elementos Web debe tener un control WebPartManager.

El cdigo siguiente muestra una WebPartZone con un nico WebPart. Los WebPart en una zona estn contenidos en su ZoneTemplate.

<asp:WebPartZone <ZoneTemplate> <asp:Calendar </ZoneTemplate> </asp:WebPartZone>

ID="WebPartZone1" Runat="server"

Runat="server"> ID="Calendar1"/>

Este ejemplo muestra una pgina simple que usa WebParts. Incluye un control WebPartManager, un control WebPartPageMenu y dos WebPartZones. Una de las zonas contiene un contro ASP.NET Calendar. 1. Entrad en la pgina 2. Seleccionad "Diseo" (Design) en la lista del men desplegable. 3. Moved los WebPart a diferentes zonas. 4. Cerrad el navegador e iniciad el ejemplo nuevamente. Podris ver que se han aplicado vuestros cambios personalizados. C# WebParts y Zonas

Las pginas con WebPart tambin pueden contener WebPart que no son visibles por defecto. Los usuarios pueden aadir estos WebPart a las pginas desde un catlogo. Un catlogo permite definir contenido opcional que por defecto no es visible en la pgina. Para dotar a la pgina de un catlogo es necesario dotarla de un control especial de zona, llamado CatalogZone. En esta zona se pueden aadir Catalog Part que proporcionan diferentes clases de controles. Este ejemplo muestra una pgina con una CatalogZone que contiene un PageCatalogPart, el cual proporciona un catlogo de todos los WebPart cerrados que se ha definido en la pgina. 1. Entrad en la pgina 2. Haced click sobre la flecha en el men desplegable del Menu Verbo del control depus haced click en el Cerrar en el calendario para cerrar el WebPart. 3. Seleccionad "Catlogo" (Catalog) de la lista desplegable del men. 4. Marcad la casilla prxima al WebPart llamado "Sin titulo" y haced click en el botn Agregar. El calendario ser agregado nuevamente a la primera zona.

C# WebPartCatalogs

Adems de permitir a los usuarios personalizar el diseo y la visibilidad de los WebPart de una pgina, se puede permitir a los usuarios editar las propiedades de cada WebPart. Cada WebPart tiene, por defecto, un conjunto de propiedades que se pueden personalizar. Cada control puede tambien proporcionar propiedades adicioneales que se pueden personalizar.

Para permitir la edicin de propiedades del control es necesario aadir a la pgina un control especial de zona llamado EditorZone. Se pueden aadir uno o ms EditorPart a esta zona. Se proporcinan los siguientes EditorPart:

El control AppearanceEditorPart permite a los ususarios editar la apariencia visual de un WebPart. El control BehaviorEditorPart permite a los usuarios editar las propiedades del comportamiento del WebPart. El control LayoutEditorPart permite editar la distribucin de un WebPart. El control PropertyGridEditorPart muestra una rejilla de propiedades que permite a los usuarios editar las propiedades personalizables de un WebPart

Es posible, adems, crear tu propio editor personalizado de WebPart por medio de la herencia desde la clase base EditorPart. Este ejemplo muestra una pgina con una EditorZone que contiene un AppearanceEditorPart. 1. Entrad en la pgina 2. Seleccionad "Editar" (Edit) en la lista desplegable del men. Ahora se podris ver el editor. 3. Haced click en "Editar" en el Men del calendario para editar el WebPart.

4. Modificad el ttulo en el editor, y haced click en Aceptar. El ttulo del calendario se actualizar. C# Editores WebPart

Creando Controles Elemento Web Personalizados Puesto que cualquier control de servidor ASP.NET puede usarse como Elemento Web, se pueden crear Elementos Web personalizados usando controles de usuario ASP.NET o controles de servidor personalizados. Este ejemplo muestra un control Elemento Web de usuario que acepta texto de entrada. El control de usuario implementa la interfaz IWebPart para proporcionar valores a las propiedades comunes del Elemento Web que se muestran, tales como su ttulo y descripcin. C# Control de Usuario WebPart

Tambin se pueden escribir

Elementos Web como controles de servidor

personalizados. Aunque se puede heredar de cualquier control, ASP.NET proporciona la clase base WebPart, la cual hace considerablemente ms fcil la personalizacin del comportamiento predeterminado del control. Este ejemplo muestra un control Elemento Web que muestra texto. El control tiene una propiedad llamada ControlText que especifica el texto a mostrar. Adems sobreescribe las propiedades AllowMinimize y AllowClose para evitar que el control sea minimizado o cerrado por el usuario.

C#

Control

Elemento

Web

personalizado

Un Elemento Web puede, tambin, proporcionar verbos personalizado que permiten a los usuarios realizar acciones sobre l. La zona es la responsable de mostrar los verbos de un Elemento Web, la mayora de las veces los verbos se muestran en el Men Verbo del Elemento Web. En el ejemplo anterior de edicin el elemento "Editar" del men desplegable era un verbo que se mostraba solamente en el modo "Edit"

Para proporcionar verbos personalizados para un control que hereda de WebPart ,se pueden sobreescribir las propiedades Verbo, crear un objeto WebPartVerbCollection con una coleccin de objetos WebPartVerb y devolverlo. Este ejemplo muestra como combinar los verbos proporcionados por la clase base con un verbo nuevo llamado "Save". El verbo se mostrar en el Men Verbo del Elemento Web. C# Aadiendo Verbos Personalizados

Un Elemento Web puede especificar tambin, propiedades que pueden ser editadas por el usuario. Para proporcionar propiedades editables se debe marcar la declaracin de la propiedad con el atributo WebBrowsable. La zona de editor (EditorZone) de la pgina debe, adems, incluir un Editor Part capaz de editar las propiedades personalizadas. Se puede usar el PropertyGridEditorPart para proporcionar edicin de las propiedades personalizadas en una tabla de propiedades. Este ejemplo hace editable la propiedad Text del Elemento Web y usa un PropertyGridEditorPart para permitir al usuario editarla.

1. Entrad en la pgina. 2. Seleccionad "Edit" en la lista desplegable. 3. Haced click en la flecha desplegable del Men Verbo del control y seleccionad Editar en el men. Se podr ver el editor con una rejilla de propiedades mostrando la propiedad Text. C# Editando Propiedades de Elementos Web

Tambin podemos proporcionar nuestros propios Editor Parts personalizados para editar propiedades del Elemento Web. Estos Editor Parts se muestran el la zona de editor cuando el usuario edita el Elemento Web. Para crear un Editor Part personalizado heredamos del control EditorWebPart. El EditorWebPart es un control compuesto, por lo que se puede sobreescribir el mtodo CreateChildControls y crear controles para el Elemento Web. Es necesario tambin sobreescribir los mtodos ApplyChanges y SyncChanges para aplicar al control los cambios que se hagan en el EditorPart.

Para proporcionar Editor Parts personalizados se puede implementar la interface IWebEditable al Elemento Web e implementar el mtodo CreateEditorParts y la propiedad WebBrowsableObject. El mtodo CreateEditorParts debe devolver una coleccin de Editor Parts. Este ejemplo muestra un Editor Part personalizado para editar una propiedad de un Elemento Web. C# Escribiendo un Editor Part personalizado

Editando Propiedades de un Elemento Web

Una caracterstica clave de los Elementos Web es la capacidad de los usuarios finales de modificar (o personalizar) las pginas web de acuerdo con sus preferencias y guardar sus ajustes personalizados para futuras sesiones en el navegador. Un aspecto de la modificacin de pginas web incluye la edicin; los usuarios pueden modificar la apariencia, diseo, comportamiento y otras propiedades de los Elementos Web visibles. Este ejemplo muestra como editar propiedades de los Elementos Web 1. Entrad en la pgina 2. Seleccionad "Edit" en la lista desplegable 3. Haced click en la flecha de la lista desplegable del Men Verbo y seleccionad "Edit" en el men. Ahora ser visible el editor con una rejilla de propiedades mostrando la propiedad Text. 4. Cambiad la propiedad "title" y pulsa OK. Un nuevo ttulo debera aparecer en el control calendario. C# Editando propiedades de Elementos Web

Los desarrolladores pueden beneficiarse del control MultiView para tener edicin de una pgina completa.

Este ejemplo muestra como implementar un escenario de edicin de pgina completa usando MultiView 1. Entrad en la pgina 2. Seleccionad "Edit" en la lista desplegable 3. Haced click en la flecha de la lista desplegable del Men Verbo y seleccionad "Edit" en el men. Ahora ser visible el editor con una rejilla de propiedades mostrando la propiedad Text. 4. Cambiad la propiedad "title" y pulsa OK. Un nuevo ttulo debera aparecer en el control calendario.

C#

Editando

pgina

completa

Un control Elemento Web puede tambin especificar propiedades que pueden ser editadas por el usuario. Para dotarlo de propiedades editables se puede marcar la declaracin de la propiedad con el atributo WebBrowsable. El EditorZone de la pgina debe tambin un EditorPart capaz de editar las propiedades personalizadas. Se puede usar el PropertyGridEditorPart para proporcionar edicin en una tabla de propiedades. Este ejemplo hace que la propiedad Text del Elemento Web sea editable y utiliza un PropertyGridEditorPart para permitir que los usuarios la modifiquen. 1. Entrad en la pgina. 2. Seleccionad "Edit" en la lista desplegable 3. Haced click en la flecha de la lista desplegable del Men Verbo y seleccionad "Edit" en el men. Ahora ser visible el editor con una rejilla de propiedades mostrando la propiedad Text. C# Haciendo WebBrowsable las propiedades web

Los desarrolladores pueden especificar un nombre "amigable" para las propiedades marcadas como WebBrowsable declarando el atributo WebDisplayName. Este ejemplo marca la propiedad Text como WebDisplayName para mostrar un nombre "amigable" en el PropertyGridEditorPart. 1. Entrad en la pgina. 2. Seleccionad "Edit" en la lista desplegable

3. Haced click en la flecha de la lista desplegable del Men Verbo y seleccionad "Edit" en el men. Ahora ser visible el editor con una rejilla de propiedades mostrando el nombre elegido. C# Definiendo un nombre "amigable"

Los desarrolladores tambin pueden especificar un tooltip para propiedades marcadas como WebBrowsable declarando el atributo WebDescription. Ese ejemplo marca la propiedad Text como WebDescription para mostrar un tooltip en el PropertyGridEditorPart. 1. Entrad en la pgina. 2. Seleccionad "Edit" en la lista desplegable 3. Haced click en la flecha de la lista desplegable del Men Verbo y seleccionad "Edit" en el men. Ahora ser visible el editor con una rejilla de propiedades mostrando el nombre elegido C# aadiendo una descripcin de la propiedad.

Podemos adems proporcionar nuestros propios EditorPart personalizados para modificar las propiedades del Elemento Web. Estos EditorPart se muestran en la zona de edicin cuando el usuario edita el Elemento Web. Para crear un EditorPart personalizado heredamos del control EditorWebPart. El control EditorWebPart es un control compuesto por lo que se puede sobreescribir el mtodo CreateChildControls y crear controles para el elemento. Es necesario sobreescribir tambin los mtodos ApplyChanges y SyncChanges para que los cambios hechos en el editor se apliquen al control.

Para proporcionar EditorParts personalizados se debe implementar la interface

IWebEditable en el elemento e implementar el mtodo CreateEditorParts y la propiedad WebBrowsableObject. El mtodo CreateEditorParts debera devolver una coleccin de EditorParts.

Este ejemplo muestra un EditorPart personalizado. 1. Entrad en la pgina. 2. Seleccionad "Edit" en la lista desplegable 3. Haz click en la flecha de la lista desplegable del Men Verbo y selecciona "Edit" en el men. Ahora ser visible el editor con el EditorPart personalizado. C# creando EditorPart personalizados

Personalizando Elementos Web

El conjunto de controles Elementos Web incluye un sistema de personalzacin de pginas que permite guardar los cambios hechos por el usuario hasta la prxima sesin. La configuracin personalzada puede incluir diseo de pgina, elementos visibles e invisibles y propiedades de los elementos. Para marcar una propiedad como personalizable se debe marcar el control con el atributo Personalizable. Generalmente una propiedad debera tener ambos atributos, WebBrowsable y Personalizable, de modo que pueda ser editada y guardada. Este ejmplo muestra una pgina con un Elemento Web que tiene una propiedad personalizable. 1. Entrad en la pgina 2. Seleccionad "Edit" en la lista desplegable. 3. Haced click en la flecha a la derecha del titulo del TextDisplayWebPart y seleccionad "Edit". El editor ser visible, con una rejilla de propiedades mostrando la propiedad ContentText. 4. Cambiad el valor de ContentText y haced click en OK. 5. Cerrad el navegador y volved nuevamente a la pgina. El Elemento Web seguir mostrando el nuevo texto.

C#

personalizacin

de

usuario

El conjunto de controles Elementos Web proporciona tambin un segundo nivel de personalizacin de pginas, llamado personalizacin compartida. Usando este modo un usuario puede crear una vista personalizada que se usa como predeterminada para todos los usuarios que vean la pgina. La personalizacin compartida no altera los contenidos de la pgina fisica, en cambio define un conjunto de configuraciones que se aplican a la pgina antes de que se aplique la personalizacin de usuario. Para especificar que un conjunto es modificable en personalizacin compartida se aade el atributo Personalizable(PersonalizationScope.Shared) a la propiedad. En este ejemplo la propiedad MaxTextDisplayLength del TextDisplayWebPart est marcada como personalizable en modo compartido. Tambin se modifica el mtodo CreateEditorParts para que solamente devuelva el editor personalizado cuando est en modo compartido. 1. Entrad en la pgina. 2. Haced click en el botn de radio Shared. 3. Haced click en la flecha a la derecha del titulo del TextDisplayWebPart y seleccionad "Edit". Se ver el editor de texto. 4. Cambiad el valor de la longitud de texto (Text Length) y haced click en OK. 5. Cerrad el navegador y vuelve nuevamente a la pgina. El Elemento Web seguir mostrando el nuevo texo. C# Personalizacin compartida

a configuracin personalizada de una pgina se guarda permanentemente, pero puede ser til restaurar los cambios a la configuracin predeterminada. Esto se puede hacer de forma programada usando la clase PersonalizationAdministration. Para restaurar la configuracin de usuario a toda la pgina se llama a PersonalizationAdministration.ResetUserState pasandole la ruta de la pgina y el nombre del usuario. Para restaurar la personalizacin compartida se llama a PersonalizationAdministration.ResetSharedState pasando la ruta de la pgina. 1. Entrad en la pgina 2. Seleccionad "Design" en la lista desplegable. 3. Moved los Elementos Web a diferentes zonas.

4. Haced click en "Reset personalizada. C#

User State".

Se

restaur

la

informacin

Restaurando

personalizacin.

Conexiones entre elementos web Los Elementos Web tambin son capaces de intercambiar informacin entre ellos mediante conexiones de Elementos Web. Usando conexiones se puede tener un Elemento Web que proporcione los valores de una o ms propiedades que pueden ser usadas por otros Elementos Web en la pgina. Las conexiones de Elementos Web tienen los siguientes elementos:

Una interfaz que define un contrato de comunicacin entre dos elementos. La interface describe propiedades y mtodos disponibles a travs de la conexin.

Un Elemento Web que se comporta como proveedor de la conexin. Para especificar un punto de conexin proveedor, un Elemento Web necesita tener un mtodo que cree y devuelva una instancia de la interfaz de comunicacin. Este mtodo debe ser marcado con el atributo ConnectionProvider. Por defecto un unico punto proveedor de conexin puede ser utilizado por mltiples consumidores de la conexin.

Un Elemento Web que se comporta como consumidor de la conexin. Para especificar un punto de conexin consumidor, un Elemento Web necesita tener un mtodo que tome una instancia de la interfaz de comunicaciones como parmetro. Este mtodo debe ser marcado con el atributo ConnectionConsumer. Por defecto un punto de conexin consumidor se puede usar solamente con un proveedor de conexin.

Se pueden conectar Elementos Web estticamente cuando se crea la pgina o permitir que el usuario conecte los elementos dinmicamente. En tiempo de ejecucin las conexiones de Elementos Web son manejadas por el WebPartManager de la siguiente forma: 1. Para cada proveedor registrado el WebPartManager llama a su mtodo de punto proveedor de conexin. 2. El proveedor devuelve una instancia de la interfaz de la comunicacin. 3. Para cada consumidor registrado para el proveedor el WebPartManager llama a su mtodo de punto de conexin consumidor pasandole una instancia de la interfaz. 4. La parte consumidora llama a las propiedades y mtodos de la instancia de interfaz. Este ejemplo muestra una conexin entre dos Elementos Web en la pgina. El elemento que muestra texto conecta con el Elemento Web de usuario que permite entrada de texto. Las dos partes intercambian texto a travs de la interface ITextCommunication.

1. Escribid texto en el control de usuario y haced click en el botn. El texto que habis escrito se mostrar en el elemento Text Display C# Conexin esttica

Un usuario puede establecer conexiones entre Elementos Web usando la ConnectionZone. Este tipo de conexiones se llaman conexiones dinmicas. Este ejemplo muestra como conectar Elementos Web dinmicamente.

1. Entrad en la pgina 2. Seleccionad "Connect" en la listra desplegable 3. Haced click en la flecha del Men Verbo del Elemento Web Text Display y seleccionad "Connect" en el men. La ConnectionZone se har visible. 4. Haced click en el link "Create a connection to a Provider" (Crear una conexin a un proveedor). 5. Seleccionad el control de usuario Super cool de la lista desplegable. 6. Haced click en "connect" 7. Escribid texto en el control de usuario y haced click en el botn. El texto que habis excrito se debe mostrar en el Elemento Web Text Display. C# Conexin dinmica

Un Elemento Web puede proporcionar multiples puntos de conexin, como resultado puede participar en multiples conexiones. Este ejemplo muestra como conectar Elementos Web dinmicamente. 1. Entrad en la pgina 2. Seleccionad "Connect" en la listra desplegable 3. Haced click en la flecha del Men Verbo del Elemento Web Text Display y seleccionad "Connect" en el men. La ConnectionZone se har visible. 4. Haced click en el link "Create a connection to a Provider" (Crear una conexin a un proveedor). 5. Seleccionad el control de usuario Super cool de la lista desplegable. 6. Haced click en "connect" 7. Escribid texto en el control de usuario y haced click en el botn. El texto que habis excrito se debe mostrar en el Elemento Web Text Display. y tambin el nmero de letras del texto.

C#

Multiples

puntos

de

conexin

Los desarroladores pueden crear conexiones por medio de cdigo. Este ejemplo muestra como conectar Elementos Web usando cdigo. 1. Haced click en el botn "Connect Web Part" (conetar elemento web) 2. Escribid texto en el control de usuario y haced click en el otn. El texto que habis escrito debera mostrarse en el Elemento Web Text Display 3. Haced click en el botn "Disconect Web Part" (desconectar elemento web). El texto que habiais escrito no debera mostrarse en el elemento web Text Display C# Conectando Elementos Web por medio de cdigo

Los desarrolladores puede deshabilitar puntos de conexin en tiempo de ejecucin. Este ejemplo muestra como deshabilitar un punto de conexin en tiempo de ejecucin. 1. Haced click en el botn de radio "Disable" (Deshabilitar). Esto rompe la conexin entre elementos web. 2. Haced click en el botn de radio "enable" (habilitar). Esto restablece la conexin entre elementos web.

C#

Deshabilitando

puntos

de

conexin

Aadiendo un nuevo modo de visualizacin Una pgina de Elementos Web puede introducir varios modos de visualizacin diferentes. En cada modo de visualizacin se muestran o se ocultan ciertos elementos de la interface de usuario de los Elementos Web y ciertas clases de modificaciones de usuario pueden estar habilitadas o deshabilitadas. El control WebPartManager contiene la implementacin para los modos de visualizacin que estn disponibles en el conjunto de Elementos Web y maneja los modos de visualizacin de una pgina. El conjunto de controles Elementos Web proporciona 4 modos incorporados: Catlogo, Conexin, Diseo, Edicin y Normal. Los desarrolladores pueden aadir nuevos modos de visualizacin o deshabilitar los modos incorporados. Este ejemplo aade un modo de visualizacin nuevo llamado InlineDisplayMode. Este modo permite a los Elementos Web un modo de editar las propiedades en lnea. 1. Entrad en la pgina 2. Haced click en la lista desplegable en la barra de ttulo del control y seleccionad "Design" en el men. Moved los Elementos Web a diferentes WebPartZones. 3. Cerrad en navegador y ejecutad el ejemplo nuevamente. Veris que vuestros cambios personalizados se han aplicado. C# Aadiendo un nuevo modo de visualizacin.

Autorizando Elementos Web El conjunto de controles Elementos Web incluye un mecanismo para autorizar Elementos Web que se aplica a todos los controles de servidor cuando se aaden a importan a una pgina. Los desarrolladores de pginas implementan

un

filtro

de

autorizacin

suscribiendo

el

evento

WebPartManager.OnAuthorizeWebPart. Este ejemplo muestra una pgina que muestra Elementos Web que son del tipo Calendar. 1. Entrad en la pgina 2. Seleccionad "Catalog" en la lista desplegable. La CatalogZone ser visible y mostrar un control calendario en su parte de catlogo declarativo. C# Autorizando Elementos Web

Se debera heredar desde la clase WebPartManager y sobreescribir el mtodo IsAuthorize si la implementacin de WebPartManager.OnAuthorizeWebPart fuera la misma a lo largo de mltiples pginas. Esta aproximacin evitar cdigo redundante en las pginas. Almacenando Perfiles de Usuario Lo Nuevo en 2.0

Perfiles de usuario - El rasgo del perfil en ASP.NET 2.0 le permite definir y guardar configuraciones de usuario para ser usado a lo largo de su aplicacin. Tambin pueden guardarse coniguraciones en un perfil annimo mientras los usuarios no hayan iniciado sesin, que puede copiarse en un perfil de usuario ms tarde.

Esta seccin trata la nueva funcionalidad de los perfiles de ASP.NET 2.0

Los sitios web necesitan frecuentemente un mtodo conveniente para almacenar los datos especficos de un usuario que se aplicarn a todo el sitio. La

caracterstica de Prefil proporciona una forma de definir datos especficos de usuario de forma fcil, as como definir y almacenar dichos datos. Un perfil de usuario es un conjunto de propiedades que definen la informacin a almacenar de los usuarios del sitio. El perfil de usuario se define mediante una sencilla sintaxis XML en un fichero de configuracin (machine.config o web.config). Para hacer referencia a la informacin del perfil desde la pgina, utilizaremos la propiedad Profile. ASP.NET lee el esquema definido en la configuracin y genera automticamente una clase accesible desde la propiedad Profile de la pgina. Podemos acceder a las propiedades del Profile de la misma forma que lo haramos para cualquier otra clase. Aunque la utilizacin ms comn del Profile es almacenar datos de usuarios autenticados, tambin permite almacenar informacin de usuarios annimos. El almacenamiento de la informacin de usuarios annimos depende de la caracterstica "Identificacin Annima" (Anonymous Identification). Las funcionalidades de Perfil y Identificacin Annima trabajan juntas para permitir el uso de la propiedad Profile para usuarios annimos. Los ejemplos incluidos en este tutorial muestran el usio de la caracterstica Profile tanto con usuarios autenticados como con usuarios annimos. Antes del inicio del ciclo de vida de la pgina, ASP.NET se asegura que el Perfil se encuentra accesible para se usado por la pgina. De forma similar, al final del ciclo de vida de pgina, ASP.NET guarda automticamente el Perfil en los almacenes de datos. De la misma forma que en otras funcionalidades, como "Pertenencia a un grupo" (Membership) o "Administrador de Roles" (Role Manager), la caracterstica Perfil ha sido diseada con un modelo basado en proveedor. Los proveedores abstraen el almacn de datos fsico correspondientes a una caracterstica de las clases y lgica de negocio de dicha caracterstica. La caracterstica Perfil viene con un proveedor para Microsoft SQL Server. Podemos crear nuestros proveedores personalizados y configurarlos para trabajar con la caracterstica Perfil. Las pginas que usan la caracterstica perfil seguirn funcionando igual con nuestros proveedores personalizados.

Adems de la propiedad Profile, la caracterstica Profile proporciona soporte para la administracin de perfiles (tanto para usuarios autenticados como annimos) con el ProfileManager (administrador de perfiles). Tareas comunes que haremos con el ProfileManager incluyen:

Burcar informacin estadstica sobre todos los perfiles perfiles de usuarios autenticados y perfiles de usuarios annimos. Determinar el nmero de perfiles que no se han modificado en un determinado perodo de tiempo. Eliminar perfiles individuales o grupos de perfiles basndonos en la fecha de ltima modificacin de estos.

Muchas gracias a Alejandra, JC y Sebastin por su inestimable ayuda en la traduccin. Definiendo el esquema del Perfil El archivo de configuracin del siguiente ejemplo define un Perfil mediante propiedades as como un grupo de propiedades. Las propiedades se definen usando elementos <add> dentro de un elemento <properties>. Un grupo de propiedades es una manera adecuada de agrupar lgicamente mltiples propiedades. Podemos definir un grupo de propiedades con un elemento <group>. En el esquema de ejemplo un grupo de propiedades llamado "AutomobilePreferences" agrupa unidas dos propiedades adicionales. Observad que los elementos <group> no pueden anidarse (esto es: solo se admite un nivel de anidamiento de grupo bajo el elemento <properties>). El esquema de ejemplo demuestra la fexibilidad disponible en trminos de definicin de tipos de datos para las propiedades de perfil. Por defecto se asume que las propiedades son de tipo System.String. Sin embargo, podemos definir una propiedad de perfil mediante cualquier tipo que pueda ser resuelto por la aplicacin ASP.NET en tiempo de ejecucin. El esquema de ejemplo incluye

definiciones

para

System.Collections.ArrayList

as

como

para

System.Drawing.Color. Observad que el elemento <add> soporta una variedad de atributos opcionales ms all de lo que se muestra en este ejemplo. Normalmente la caracterstica de perfil serializa las propiedades usando cualquiera tipo de conversin a cadena o serializacin Xml. Sin embargo no todos los tipos son serializables como cadena o como fragmentos Xml. Esto es por lo que la propiedad "PreferredBackgroundColor" tiene un atributo serializeAs que indica explcitamente serializacin binaria. La propiedad "PricePoint" tiene un atributo defaultValue que define el valor por defecto para esta propiedad si an no se ha definido uno. La propiedad "PreferredBackgroundColor" tambin tiene un atributo

allowAnonymous que est establecido a true. Por defecto las propiedades de perfil estn restringidas a usuarios autentificados. Cuando el atributo allowAnonymos est establecido a true indca que la propiedad se puede usar tambin para cargar y guardar informacin para usuarios annimos. Esquema de perfiles en web.config

Perfiles annimos El esquema de perfil mostrado en el ltimo ejemplo permite tanto a usuarios autentificados como annimos guardar su color de fondo preferido. En la pgina de ejemplo un usuario annimo puede elegir desde una seleccin de colores. Cuando la pgina se refresca lo har usando el color seleccionado. Daos cuenta que si cerris el navegador, y volvis a ejecutar el ejemplo se recuerda la seleccin de color. La razn para esto es que la caracterstica Identificacin de Annimos (Anonymous Identification) se ha habilitado para todos los ejemplos (por defecto la Identificacin de Annimos est deshabilitada). La caracterstica Identificacin de Annimos genera automticamente un identificador aleatorio para un usuario annimo y lo almacena en una cookie. En las siguientes visitas al sitio

se usa el identificador de la cookie como "id" sustituto cuando se recupera la informacin de perfil para un usuario annimo. En la pgina de ejemplo, podemos recuperar o definir el color de fondo usando la sintaxis Profile.PreferredBackgroundColor. El estilo de cdigo para usar una propiedad Profile es el mismo que para acceder a propiedades en cualquier otra clase. En este ejemplo la pgina usa alguna conversin comn disponible en la estructura System.Drawing.Color Profile.PreferredBackgroundColor. C# Almacenando datos de perfil para usuarios annimos para recuperar o definir

Perfiles autentificados En este ejemplo entraremos como usuarios autentificados y estableceremos valores para todas las propiedades del perfil. La primera vez que ejecutemos el ejemplo estaremos en una pgina de inicio accesible tanto para usuarios annimos como autentificados. Observad que el color de fondo se establece al valor que seleccionamos como usuarios annimos en el ejemplo anterior. Hacemos click en el enlace que permite crear un usuario nuevo (este enlace est en la parte inferior del control de autentificacin). Escribimos un nombre de usuario y una contrasea y hacemos click en el botn para crear un nuevo usuario. Despus de crear el nuevo usuario hacemos click en el botn para continuar hacia la pgina que muestra las propiedades del perfil para usuarios autentificados. Cuando veamos la pgina por primera vez con todas las propiedades de vuestro perfil, os veremos que el color de fondo est definido en el color que elegimos como usuarios annimos en el ejemplo anterior. La razn de esto se explica con mayor detalle en el ejemplo siguiente. Por ahora observad que podemos definir valores para todas las propiedades del perfil. Daos cuenta tambin que

inicialmente el punto del precio del automvil est establecido a su valor por defecto definido en el esquema del perfil. Despus de introducir los nuevos valores en el formulario HTML, presionaremos el botn "Update preferences" (actualizar preferencias). Ahora haremos click en el botn de cierra de sesin para que se borre la cookie de "Forms Authentication" de nuestra mquina.A continuacin cerramos el navegador.Si ahora volvemos a entrar en la pgina, se nos volvern a pedir las credenciales. Tras introducirlas y iniciar sesin, observad como la pgina muestra correctamente la informacin que habamos introducido. Si hacmos click en el link que nos devuelve a la pgina de inicio veremos que la pgina de inicio usa tanto el nombre como el color de fondo que seleccionamos para el usuario autentificado. Esto demuestra como se pueden usar los perfiles entre pginas seguras y no seguras en un sitio. En la pgina de inicio el color de fondo y el nombre se muestran usando o el Perfil de usuario annimo (si an no nos hemos autentificado) o bien el perfil de usuario autentificado (una vez que hemos iniciado sesin). Como en el ejemplo annimo, este ejemplo demuestra como la sintaxis del Perfil sigue la sintaxis de acceso a propiedades de VB.NET y C#. Observad que la sintaxis para acceder a propiedades en un grupo de propiedades usa dos niveles de acceso a propiedades: Profile.AutomobilePreferences.PricePoint. El grupo de propiedades simplemente acta como una propiedad intermedia. El cdigo para manipular Profile.AutomobilePreferences.CarModels muestran el uso de un System.Collections.Arraylist como propiedad de un perfil. La cadena que se escribe en el formulario HTML debe ser un conjunto de nombres delimitado por comas. El cdigo de la pgina lo convierte en un System.Array de cadenas antes de aadir los valores del array a la propiedad Profile.AutomobilePreferences.CarModels. Cuando obtenemos los modelos de coche, los Profile.AutomobilePreferences.CarModels se enumeran usando para cada uno sintaxis estndar.

C#

Almacenando

datos

de

perfiles

para

usuarios

autentificados

Migrando Perfiles Annimos a Perfiles Autenticados En Ejemplos anteriores qued demostrado que el color de fondo para un usuario annimo era pasado al usuario autenticado. Podemos verificar esto ejecutando el ejemplo de abajo. Si ya nos hemos autenticado, hacemos click en el vnculo de Logout al final de la pgina. En la pgina de inicio, seleccionamos un color diferente del dropdown en la esquina superior izquierda de la pgina. La pgina de inicio se refrescara y se mostrar usando el color de fondo seleccionado. Adems, la pgina tendr un texto diciendo "Hello Anonymous User" porque la propiedad name en el Profile es solo soportada por usuarios autenticados. Autentiqumonos en el sitio usando el control login de la pgina de inicio. Notamos como una vez nos autenticamos, el color de fondo de la pgina del perfil refleja la seleccin que se hizo previamente como un usuario annimo. En la pgina de propiedades del perfil, hacemos clic en el link que nos lleva de vuelta a la pgina de inicio. Observad que en la pgina de inicio el nombre que se muestra est basado en el valor establecido para la propiedad Profile.Name. Ahora que estamos de vuelta en la pgina de inicio como usuarios autentificados, seleccionamos un color diferente de la lista desplegable y hacemos clic en el botn a actualizar. La pgina se refresca y usa el color de fondo actualizado. Si posteriormente hacemos clic en el link que os lleva de vuelta a la pgina de propiedades del perfil veremos que el color de fondo se mantiene. Una vez que estemos de vuelta en la pgina de propiedades del perfil hacemos clic en el botn de desconexin. Esto nos redirigir de vuelta a la pgina de inicio. Daos cuenta que cuando se nos redirige a la pgina de inicio nuestras selecciones previas para el color de fondo ya no son efectivas. Hay dos razones para esto. Primeramente, una vez que nos hemos desconectado el sitio considera que somos usuarios annimos y como resultado cualquier color de fondo que hubiera

sido seleccionado en el perfil de usuario autentificado no est disponible. En segundo lugar, cualquier seleccin de color que hubiera sido hecha anteriormente como usuario annimo ya no est disponible. La razn para esto es que una vez que un usuario annimo se autentifica, la cookie que contena el identificador annimo autogenerado se borra del navegador. Como resultado, cuando nos autentificamos y posteriormente nos volvemos a desconectar el sitio considera que somos usuarios annimos completamente nuevos. Esta interaccin entre usuarios annimos y usuarios autentificados conduce a la necesidad de migrar datos desde los perfiles annimos hacia los perfiles autentificados. La caracterstica de perfil expone un evento llamado MigrateAnonymous. Podemos suscribirnos a este evento colocando un manejador de eventos en global.asax llamado Profile_MigrateAnonymous. Este evento se dispara simpre que un identificador annimo est disponible (bien como una cookie o bien como un ticket sin cooquies) y el usuario se autentifica. En el manejador de eventos podemos cargar el Perfil del usuario annimo llamando a Profile.GetProfile y pasndole el ID de usuario annimo (el ID de usuario annimo es una de las propiedades disponibles de los argumentos del evento). Una vez que tenis una referencia al Perfil annimo podemos transferir las propiedades establecidas desde el Perfil annimo hacia el Perfil autentificado. El global.asax del ejemplo demuestra la transferencia del color de fondo desde el perfil annimo al perfil autentificado. El cdigo tambin elimina el perfil annimo de la base de datos. Finalmente, el cdigo llama a un mtodo en identificacin annima para eliminar la cookie que contiene el identificador annimo. Observad que los programadores deben elegir explcitamente eliminar el identificador annimo en la peticin, de otro modo ASP.NET no eliminar automticamente el identificador. Cuando el evento MigrateAnonimous finalice, ASP.NET habr expedido una cabecera Http para eliminar el identificador annimo en el navegador y en la siguiente peticin de pgina el evento no se volver a disparar

C# Migrando datos de perfil de un usuario annimo a un usuario autenticado

Definiendo las Propiedades del Perfil con una Classe Base Personalizada El web.config mostrado antes inclua un atributo llamado inherits en el elementeo <profile>. Este atributo instruye a ASP.NET a autogenerar una clase para la propiedad Profile herendando de una clase personalizada. En este ejemplo, el nombre de la clase es UserDefinedProfileClass y se encuentra en el directorio App_Code. La clase personalizada hereda de ProfileBase porque la clase autogenerada para la propiedad Profile debe tener siempre ProfileBase en la jerarqua de herencia. Cualquier propiedad pblica definida en una clase base personalizada es visible y utilizable desde la propiedad Profile.

Ejecutamos el ejemplo e iniciamos sesin. En la pgina de propiedades, los datos del listbox ,que contienen las preferencias de comida basura, se almacenan mediante la propiedad definida en la clase base personalizada. De la misma forma que con otras propiedades del Perfil, las preferencias de comida se acceden mediante la sintaxis estndar de una propiedad: Profile.JunkFood.

La ventaja de definir una clase base personalizada reside en que los desarrolladores pueden "interceptar" los sets y gets de las propiedades e implementar una lgica de negocio compleja en los mtodos get y set de las propiedades. En el cdigo del ejemplo, la clase base personalizada define una propiedad utilizando Generics. La definicin de la propiedad muestra los requerimientos mnimos: la implementacin de la propiedad debe llamar a la clase base, ya que sta clase (ProfileBase) es la que contiene la lgica para serializar los datos, as como para comunicarse con el/los proveedor/es subyacentes.

Esquema

de

perfil

en

web.config

C#

Utilizando

una

Clase

Base

Personalizada

Automatic Profile Save Behavior La funcin Perfil determinar de forma automtica si un Perfil est sucio. Si el Perfil parece estar sucio, el ProfileModule, que se ejecuta al final de cada peticin de una pgina, llamar al mtodo Save del Perfil, guardando as los datos mediante el(los) proveedore(s) configurados. Sin embargo, la funcin Perfil solo puede detectar de forma segura los cambios en los datos cuando los datos se escriben como un System.String o un tipo primitivo, como System.Int16, System.Int32, etc. Si un Perfil contiene tipos de datos ms compejos, el comportamiento por defecto del Perfil es asumir que el Perfil est sucio y siempre intentar salvar los datos. Para optimizar el rendimiento, un desarrollados puede implementar lgica en sus pginas para determinar si el Perfil est realmente sucio. Si un desarrollador determina que el Perfil no ha cambiado, puede enganchar el evento ProfileAutoSaving escribiendo un manejador de eventos en global.asax. false, el El argumento ProfileModule del evento no incluye intentar una propiedad el llamada Perfil. ContinueWithProfileAutoSave. Si el desarrollador establece dicha propiedad a salvar

Ejecutamos el ejemplo, iniciando sesin de nuevo si es necesario. Esta pgina es la misma que la utilizada antes para mostrar las propiedades de los perfiles, pero se le ha aadido un segundo botn. Si editamos alguno de los datos del perfil y luego hacemos clic en el botn que cancela la funcin de salvado automtico, cuando la pgina se recarga, los antiguos valores de la propiedad se mostrarn. El cdigo ejemplo muestra como subscribir el evento ProfileAutoSaving en el fichero global.asax y cancelar el guardado si una propiedad se ha fijado en el grupo HttpContext.Items. El manejador del evento clic del botn de la pgina establece

este tem para indicar que el comportamiento de guardado automtico debe cancelarse. Observad que si el desarrollador no quiere que el ProfileModule intente guardar, el comportamiento de guardado automtico se puede cancelar estableciendo el atributo de elemento automaticSaveEnabled dentro de <profile> a false. C# Controlando el Guardado Automtico del Perfil

Eliminando un Perfil Con el paso del tiempo, la cantidad de datos de perfil de un sitio crecer, especialmente para sitios que utilizan perfiles annimos. La clase ProfileManager proporciona un nmero de mtodos para eliminar los datos de Perfiles. El ejemplo muestra el uso de ProfileManager.DeleteProfile para eliminar el perfil del usuario que ha iniciado sesin. Para ejecutar el ejemplo, tenemos primero que iniciar sesin. Una ves lo hemos hecho, pordemos hacer clic en el botn para eliminar los datos del perfil. A continuacin seremos redirigidos a la pgina de propiedades del perfil. Observad que, en este momento, todos los datos del anterior perfil se han borrado y necesitamos volver a introducir lo nuevos datos del perfil en el formulario. En entornos de produccin, normalmente utilizaremos ProfileManager en una tarea programada de manteniemito. Por ejemplo, podemos crear una tarea diaria que ejecute una aplicacin de consola que utilice ProfileManager para eliminar los perfiles que han estado inactivos durante ms de treinta das. Como la caracterstica Perfil es soportada en entornos no-ASP.NET (por ejemplo aplicaciones de consola o servicios de aplicaciones NT), podemos crar operaciones orientadas a aplicaciones mediante la clase ProfileManager.

C#

Eliminando

un

Perfil

Usar la cach para mejorar el rendimiento Lo nuevo en la 2.0

Caractersticas de desarrollo flexibles - ASP.NET 2.0 incluye nuevas caractersticas de cach como las Dependencias Personalizadas, el API de Cacheado fragmentado y la Substitucin post-cach para permitir un mayor nmero de escenarios y mejorar la experiencia de desarrollo en general. Mantenimiento aumentado - ASP.NET 2.0 mejora la implantacin y el mantenimiento de las funcionalidades de cach mediante caractersticas como los Perfiles de Cach y la Configuracin de Cach. Mejor escalabilidad y rendimiento - Nuevas caractersticas, como la Invalidacin de Cach SQL, estn enfocadas a la construccin de sitios con mejor rendimiento.

Esta seccin desarrolla estas y otras caractersticas de cacheado en ASP.NET 2.0.

El cacheado es una tcnica usada comunmente en la informtica para mejorar el rendimiento, manteniendo datos pesados o de uso frecuente en memoria. En el contexto de una aplicacin Web, el cacheado se usa para mantener pginas o datos a travs de peticiones HTTP y reutilizarlos si incurrir en el gasto de tener que volver a crearlos.

ASP.NET tiene varios tipos de cacheado que pueden usarse en aplicaciones Web: Cacheado El cacheado de salida es til cuando podemos cachear los de Salida contenidos de una pgina entera. En un sitio con mucho trfico, meter en cach aquellas pginas con muchos accesos incluso slo durante un minuto puede dar como resultado en mejoras sustanciales en los tiempos de respuesta. Mientras que una pgina est siendo tratada por el cach de salida, el resto de peticiones posteriores a esa misma pgina se sirven desde la pgina de salida sin ejecutar el cdigo que la cre.

Cacheado A veces no es prctico meter en cach una pgina entera - quizs fragmentado haya que personalizar o crear porciones de la pgina por cada peticin. En este caso, a menudo es beneficioso identificar los objetos o los datos que son costosos de construir y, por tanto, susceptibles de cacheo. Una vez hemos identificado estos elementos, podemos crearlos una vez y entonces meterlos en la cach durante un periodo de tiempo. Adems, el cacheado fragmentado puede usarse para meter en la cach partes de la salida de una pgina. Elegir el momento para cachear un elemento puede convertirse en Cacheado de una decisin interesante. Para algunos elementos, los datos datos pueden refrescarse a intervalos regulares o los datos pueden ser vlidos slo durante un cierto periodo de tiempo. En ese caso, se puede proporcionar una poltica de caducidad a los elementos de la cach que los haga ser eliminados de la misma cuando hayan caducado. El cdigo que acceda al elemento en cach debe simplemente comprobar la presencia del elemento y volver a crearlo si es necesario. El cach de ASP.NET soporta dependencias de archivo y de clave de cach, lo que permite a los desarrolladores hacer a un elemento de cach dependiente de un archivo externo o de otro elemento de cach. Esta tcnica puede usarse para invalidar elementos cuando su fuente de datos subyacente haya cambiado. ASP.NET 2.0 incluye algunas nuevas caractersticas para Configuracin ayudarnos con la configuracin de la cach. Los perfiles de cach de cach te permiten configurar perfiles de cach en el sistema de configuracin, para usar despus esos perfiles en pginas. Esto permite que se hagan cambios al cacheado de conjuntos de pginas de forma global. Se han aadido tambin ms opciones para personalizar el rendimiento de la cach. Muchas gracias a Carlos y Josema por su ayuda en la traduccin de esta parte del tutorial.

Cacheado de la pgina de salida El cacheado de salida es una potente tcnica que incrementa la respuesta de las peticiones y respuestas metiendo en la cach el contenido generado por pginas dinmicas. El cacheado de salida est habilitado por defecto, pero el resultado de

una respuesta determinada no se cachea a menos que se especifique esa respuesta como cacheable. Para hacer que sea posible cachear una respuesta, debe tener una poltica vlida de caducidad o validacin y visibilidad pblica de su cach. Podemos hacer esto o bien usando la API de bajo nivel OutputCache o la directiva de alto nivel @OutputCache. Cuando se habilita el cach de salida, se crea una entrada de cach de salida en la primera peticin GET a la pgina. Todas las peticiones GET o HEAD posteriores se sirven desde la cach de salida hasta que la peticin cacheada caduca. La cach de salida tambin permite variaciones de pares nombre/valor GET o POST cacheados. La cach de salida respeta las polticas de caducidad y validacin de las pginas. Si una pgina est en el cach de salida y ha sido marcado con una poltica de caducidad que indica que la pagina caduca a los 60 minutos de haber sido cacheada, se quita a la pgina del cach de salida a los 60 minutos. Si se recibe otra peticin despus de ese intervalo, el cdigo de la pgina se ejecuta y la pgina puede ser cacheada de nuevo. Se llama caducidad absoluta a este tipo de poltica de caducidad - una pgina es vlida durante cierto tiempo. La Directiva de cach de salida El siguiente ejemplo demuestra una forma simple de cachear respuestas de salida mediante la directiva @OutputCache. Este ejemplo simplemente muestra la hora a la que se gener la respuesta. Para ver el cacheado de salida en accin, cargad la pgina y observa la hora a la que se gener la respuesta. Entonces refrescad la pgina y observad que la hora no ha cambiado, lo que indica que se est sirviendo la segunda respuesta desde el cach de salida. Cach de salida en C#

La siguiente directiva activa el cach de salida en la respuesta:

<%@ OutputCache Duration="60" VaryByParam="none"%>

Esta directiva indica sencillamente que la pgina debe cachearse durante 60 segundos y que la pgina no variar por ningn parmetro GET o POST. Las peticiones que se reciban mientras la pgina est en la cach sern respondidas desde la cach. Despus de 60 segundos, se quita a la pgina de la cach; se maneja la siguiente peticin de forma explcita y se vuelve a cachear la pgina. Por supuesto, en el ejemplo anterior se ahorra muy poco trabajo mediante el cacheado de salida. El siguiente ejemplo demuestra la misma tcnica de cacheado de salida, pero realizando una llamada a una base de datos y mostrando los resultados en una tabla. Cach de salida en C# 2

Cambiar mediante parmetros En este ejemplo modificamos ligeramente la aplicacin para permitir al usuario que busque de forma selectiva autores en varios estados. El ejemplo muestra el cacheado de peticiones que cambien los pares nombre/valor de la cadena de consulta usando el atributo VaryByParam de la directiva OutputCache. <%@ OutputCache Duration="60" VaryByParam="state" %>

Por cada estado en el conjunto de datos, hay un vnculo que pasa el estado deseado como parte de la cadena de consulta. Entonces la aplicacin construye la consulta apropiada a la base de datos y muestra slo aquellos autores que pertenezcan al estado seleccionado.

Observa que la primera vez que hacemos clic en el vnculo de un estado determinado se genera una nueva etiqueta de fecha en la parte inferior de la pgina. A partir de ah, cada vez que se vuelva a introducir una bsqueda por ese estado en el espacio de un minuto, la etiqueta muestra la fecha y hora a la que se cache la peticin original. Cacheado de salida VaryByParam en C#

Notificacin de Cach SQL nuevo en 2.0 En el ejemplo anterior los datos se cacheaban durante 60 segundos, sin importar si los datos haban cambiado en la base de datos. La invalidacin de cach SQL te permite hacer que la cach de entrada dependa de la base de datos, de tal manera que el cach de entrada solamente se limpiar cuando los datos en la base de datos hayan cambiado. Para ms detalles, ver la pgina Notificacin de Cach SQL.

Sustitucin post-cach nuevo en 2.0 En ASP.NET 1.0, las pginas que eran estticas en su mayor parte pero que contenan una pequea regin dinmica, como el nombre de usuario o la hora actual, eran forzadas con frecuencia a no usar cacheado o a dividir la pgina en mltiples controles de usuario cacheados con cach de fragmentos. ASP.NET 2.0 permite que estas pginas se aprovechen del cacheado de salida, permitiendo que las pginas de salida cacheadas puedan insertar nuevo contenido dinmico en cada solicitud. En el siguiente ejemplo, la pgina con salida cacheada inserta una llamada dinmica a un mtodo esttico que devuelve la fecha actual mediante la API

Response.WriteSubstitution. Esta llamada dinmica se ejecuta en cada solicitud, y el resultado se inserta en la cadena de cach de respuesta que se sirve desde el cach de salida. Sustitucin Post-cach, C#

El siguiente ejemplo realiza la misma accin que el anterior, pero usa un control asp:Substitution para insertar el contenido dinmico. Control de Sustitucin en C#

Usando el API de Cach Aquellas aplicaciones que necesiten ms control sobre los encabezados HTTP relacionados con el cach pueden usar la funcionalidad proporcionada por la clase System.Web.HttpCachePolicy. El siguiente ejemplo muestra el cdigo equivalente a las directivas de pgina de ejemplos anteriores: Response.Cache.SetExpires(DateTime.Now.AddSeconds(60)); Response.Cache.SetCacheability(HttpCacheability.Public);

C# Podemos convertirla en una poltica de caducidad deslizante, haciendo que la hora de caducidad se vuelva a establecer cada vez que se hace una peticin a la pgina, estableciendo la propiedad SlidingExpiration como en el siguiente ejemplo. Response.Cache.SetExpires(DateTime.Now.AddSeconds(60)); Response.Cache.SetCacheability(HttpCacheability.Public); Response.Cache.SetSlidingExpiration(true);

C# Nota: Cuando se habilita la caducidad deslizante (SetSlidingExpiration(true) ), cada peticin hecha al servidor de origen siempre genera una respuesta. La cach deslizante es til en escenarios donde existen cachs hacia el cliente que pueden satisfacer peticiones de cliente, si el contenido no ha caducado an, sin solicitar el contenido del servidor de origen.

Cacheado por fragmentos de pgina Adems de poder cachear la salida de una pgina entera, ASP.NET te proporciona una forma simple de cachear la salida de regiones de contenido de pgina, a la que se le ha dado el nombre de cacheado por fragmentos. Podemos delimitar reas de nuestra pgina mediante un cotnrol de usuario, y marcarlas para que sean cacheadas usando la directiva @OutputCache de la que hemos hablado en la seccin anterior. Esta directiva especifica la duracin (en segundos) que debe estar cacheado en el servidor el contenido de salida del control de usuario, as como cualquier otra condicin opcional por la cual debiera cambiar. Por ejemplo, la siguiente directiva le dice a ASP.NET que meta en la cach de salida al control de usuario durante 120 segundos, y que cambie el cach usando las cadenas de bsqueda "CategoryID" y "SelectedID" o los parmetros de envo del formulario.

<%@ OutputCache Duration="120" VaryByParam="CategoryID;SelectedID"%>

El atributo VaryByParam es extremadamente potente y permite a los creadores de controles de usuario ordenar a ASP.NET para que almacene en cach mltiples instancias de una regin de cach de salida en el servidor. Por ejemplo, las siguientes URLs distinguen entre distintas instancias de contenido del control de usuario del ejemplo anterior.

http://localhost/mypage.aspx?categoryid=foo&selectedid=0 http://localhost/mypage.aspx?categoryid=foo&selectedid=1 Por lo tanto, la lgica dentro de un control de usuario puede generar dinmicamente contenido diferente (que se cachea por separado) dependiendo de los argumentos que reciba. Adems de permitir el atributo VaryByParam, el cacheado por fragmentos tambin permite un atributo VaryByControl. Mientras que el atributo VaryByParam cambia los resultados cacheados basndose en pares nombre-valor enviados mediante POST o GET, el atributo VaryByControl cambia el fragmento cacheado en base a controles dentro del control de usuario. Por ejemplo:

<%@ OutputCache Duration="120" VaryByParam="CategoryID;SelectedID"%>

Tened en cuenta que, como con las pginas con cach de salida, se requiere el uso explcito tanto de VaryByParam como de VaryByControl incluso si no se usa ninguno de los dos. Si el control de usuario contiene un control de lista desplegable llamado Categora podramos variar los resultados del control de usuario dependiendo del valor seleccionado dentro de la lista desplegable. El siguiente cdigo de ejemplo muestra cmo meter en cach dos seccin de men de una pgina mediante un control de usuario declarativo. <%@ <%@ Register Page TagPrefix="Acme" Language="C#" TagName="Menu" Src="Menu.ascx" %> %>

<html> <body> <table> <tr> <td> <Acme:Menu </td> <td> <h1>Hola, la </td>

Category="MenuIzquierdo"

runat=server/>

hora

actual

es:

<%=DateTime.Now%>

</h1>

<td> <Acme:Menu </td> <tr> </table> </body> </html> C#

Category="MenuDerecho"

runat=server/>

El siguiente ejemplo demuestra la implementacin del control de usuario "Acme:Menu" con soporte para cach. <%@ <%@ <script public void Page_Load(Object conn = String sender, new EventArgs Control Language="C#" ClassName="AcmeMenu" OutputCache Duration="120" VaryByParam="none" %> %>

runat=server> Category; e) {

AdoConnection

AdoConnection("MyDSN");

MyMenu.DataSource = conn.Execute("select * from menu where category=" + Category ); MyMenu.DataBind(); } </script> <asp:datagrid id="MyMenu" runat=server/> C# Tened en cuenta que este ejemplo mete en la cach de salida la respuesta de cada control de usuario durante un periodo de 120 segundos. Toda la lgica necesaria para recrear cada control de usuario de tipo men en caso de producirse un fallo en la cach (sea porque han pasado los 120 segundos o porque la memoria en el servidor se ha quedado corta) se ha encapsulado limpiamente dentro del control de usuario.

El siguiente ejemplo demuestra un cacheado de fragmentos simple. El ejemplo cachea la salida de un control que recupera datos desde una base de datos SQL Server, mientras que mantiene las propiedades dinmicas de la pgina padre. Se puede ver que la pgina es dinmica porque la hora se actualiza con cada refresco, mientras que el control de usuario slo se actualiza cada 60 segundos. Cach por fragmentos en C#

Nota: Cualquier intento de manipular mediante programacin un control con la salida cacheada desde su pgina contenedora dar como resultado un error. Por ejemplo, intentar usar una expresin de enlace de datos declarativa en el control de usuario genera errores de parser, como vemos en el siguiente cdigo. <!-- Las siguientes etiquetas generan errores de parser --> <Acme:Menu Categoria='<%# Container.DataItem("Categoria")' runat="server" /> La razn de esto es sencilla. En aquellos casos en los que el contenido de un control de usuario tenga su salida cacheada, se crea una instancia del control slo en la primera peticin que se le hace; de esa manera, una vez en la cach, el control ya no est disponible. En lugar de ello, deberamos encapsular toda la lgica necesaria para crear el contenido de un control de usuario directamente dentro del mismo control; normalmente dentro de los eventos Page_Load o Page_PreRender del control de usuario. Se pueden declarar y usar otros parmetros de propiedades declarativas al personalizar el control. Por ejemplo, podramos personalizar el anterior control de usuario de la siguiente manera: <Acme:Menu Categoria="MenuIzquierdo" runat="server"/> <Acme:Menu Categoria="MenuDerecho" runat="server" />

Estas declaraciones hacen que el compilador de la pgina genere y ejecute el cdigo apropiado en caso de que se haya creado al control como resultado de un fallo de cach. As, los desarrolladores del control de usuario pueden acceder a estas propiedades tal y como lo haran con un control de usuario no cacheado. API de cacheado de fragmentos Nuevo en 2.0 Adems de usar la directiva @OutputCache, podemos ajustar mediante programacin las opciones de cach para controles de usuario usando la CacheAPI. En el siguiente ejemplo, el control cambia el tiempo que permanece en cach basndose en el estado que se seleccione del control de lista desplegable. Puedes ver la hora a la que se dibuj el control y la hora a la que se limpiar la entrada de cach. API de Cach por Fragmentos en C#

Cacheando los datos de la pgina ASP.NET dispone de un motor de cach completo que puede ser usado por las pginas para almacenar y recuperar cualquier tipo de objeto a travs de las peticiones HTTP. La cach de ASP.NET es privada para cada aplicacin y almacena los objetos en memoria. La duracin de la cache es equivalente a la duracin de la aplicacin; esto significa que cuando una aplicacin se reinicia, la cache se vuelve a crear. La cach proporciona una interface con un Diccionario simple que permite a los programadores facilmente poner objetos en la cach y recuperarlos. En elcaso ms simple, volcar un elemento en la cache es como aadir un elemento a un diccionario: Cache["myKey"] = myValue;

La recuperacin de datos del cache es muy simple. Hay que tener en cuenta que debe de comprobarse la existencia del objeto en cache antes de recuperarlo, como se muestra en el ejemplo siguiente:

myValue if(myValue DisplayData(myValue); }

= != null )

Cache["mykey"]; {

Usando los datos de la Cach El siguiente ejemplo muestra otro uso sencillo de la cach. Ejecuta una consulta a la base de datos y guarda en cach el resultado, qu se seguir usando durante la vida de la aplicacin. Cuando ejecutis el ejemplo, observad el mensaje en la parte inferior de la pgina. Con la primera peticin, indica que los datos han sido recuperados de la base de datos. Despues de refrescar la pgina, se apunta que se ha usado la copia de la cach. C# Datos de Cach

El siguiente ejemplo muestra un elemento de la cach que depende de un fichero XML. Es similar al primer ejemplo pero en este caso, el dato es recuperado de una fuente XML en vez de un servidor de base de datos. Cuando el dato es guardado en la cach, el fichero XML se le aade como una dependencia. Cuando se aade un nuevo registro usando el formulario al final de la pgina, el fichero XML se actualiza y el elemento de la cach se refresca. C# Data Cache 2

Fjese que el fichero de dependencia se aade usando Cache.Insert y mediante un objeto CacheDependency referenciando al fichero XML. Puede usarse el mismo mecanismo para dependencias personalizadas.

Cache.Insert("MyData", new CacheDependency(Server.MapPath("authors.xml")));

Source,

Un elemento de la cach puede depender de uno o varios ficheros o claves. Como vimos antes, una aplicacin tambin puede establecer la poltica de caducidad de un elemento de la cache. El siguiente cdigo establece un tiempo de caducidad absoluto para el objeto de la cach.

Cache.Insert("MyData", Source, DateTime.Now.AddHours(1), TimeSpan.Zero);

null,

El parametro ms importante es la llamada a DateTime.Now.AddHours(1), que indica que el elemento caduca una hora despus de que se ha insertado. El ltimo argumento, TimeSpan.Zero, indica que no hay una poltica relativa de caducidad en este item. El siguiente cdigo muestra como estableces una poltica de caducidad relativa. Se inserta un item en la cach que caduca 20 minutos despus de su ltimo acceso. Observad el uso de DateTime.MaxValue, que indica que no se establece una poltica absoluta de caducidad para este elemento.

Cache.Insert("MyData", TimeSpan.FromMinutes(20));

Source,

null,

DateTime.MaxValue,

Para aquellas aplicaciones que necesitan una funcionalidad ms sofisiticada, el cache de ASP.NET suporta barrido, caducidad y dependencias de ficheros y de claves.

Barrido de los elementos de cache La tcnica del barrido es el proceso que intenta quitar de la cach elementos poco usados o no importantes cuando la memoria empieza a escasear. Si un programador quiere controlar como se ejecuta el barrido puede establecer las caractersticas de barrido de los objetos cuando se insertan en al cache, indicando la importancia del elemento y la frecuencia con la que el elemento debe utilizarse para mantenerse disponible en cache. Caducidad de los elementos de cache La caducidad permite a los programadores indicar a cada elemento de la cach su tiempo de duracin. Pueden indicarse se forma explicita ( por ejemplo, caduca a las 6:00) o puede indicarse de forma relativa a la ultima vez que el elemento fue usado( por ejemplo, caduca 20 minutos despus de que se us por ultima vez). Cuando un elemento caduca, es eliminado de la cache y los siguientes intentos de recuperarlo devolveran un valor null a menos que vuelva a ser insertado en la cach. Dependencias de la cache Las dependencias de la cach permiten establecer la validez de un elemento de la cache basado en un fichero externo o en otro elemento de la cache. Cuando una dependencia cambia, el elemento de la cache dependiente se invalida y es eliminado de la cache. Para ver un ejemplo de como usar esta prestacin, imaginemos el siguiente escenario: una aplicacin lee informacin financiera de un fichero xml que se actualiza periodicamente. La aplicacin procesa los datos del fichero y crea un grfico de objetos que representan los datos de forma visible. La aplicacion guarda en cache los datos e inserta una dependencia del fichero del cual los datos se leen. Cuando el fichero se actualiza, los datos se eliminan de la cache y la aplicacin puede volver a leer el fichero e insertar la copia actualizada de los datos en la cache. ASP.NET 2.0 permite la herencia de la clase System.Web.Caching.CacheDependency, facilitando que cualquier programador pueda reescribir su propia implementacin de una dependencia de cach.

Desarrollando su propiar dependencia de cache, puede aprovechar las ventajas del mecanismo de invalidacin para mantener el contenido de la cach actualizado con el origen de los datos. sta es una forma mas eficaz y rentable de asegurar la validez de los datos y habilitar la sincronizacin de la cache que la utilizacin de la expiracin de los elementos de la cache frecuentemente. ASP.NET dispone de dos tipos de dependencias construidas sobre la base de CacheDependency: AggregateCacheDependency, qu permite el uso de mltiples dependencias para elementos de cache complejos que dependan de mas de un tipo de recurso, y SqlCacheDependency, que se describe en Invalidacin de la Cach SQL. Invalidacin de la cache SQL (Nuevo en 2.0 ) En el ejemplo anterior, los datos eran guardados en cache durante 60 segundos, sin tener en cuenta si los datos han cambiado en la base de datos. El mecanismo de invalidacin de la cache de SQL le permite establecer un elemento de la cache dependiente dela base de datos, de forma que el elemento de la cache se borrar cuando la base de datos cambie. <a name="polling"> Invalidacin basada en sondeos Este mecanismo usa un sondeo para comprobar si una tabla ha sido actualizada desde que la pgina se guard en la cach. Para habilitar la cach basada en tabla se requieren los siguientes pasos: 1) Habilitar las notificaciones de la base de datos utilizando la herramienta aspnet_regsql.exe >aspnet_regsql.exe -S ".\SQLExpress" -E -d "pubs" -ed Este paso slo hace falta hacerlo una vez por cada base de datos. 2) Habilitar las notificaciones para la tablas o las tablas que quiere que tenga las dependencias utilizando la herramienta aspnet_regsql.exe

>aspnet_regsql.exe -S ".\SQLExpress" -E -d "pubs" -et -t "authors"

3) Registrar la notificacion en el fichero de configuracind de la aplicacin:

<system.web> <caching> <sqlCacheDependency enabled="true" pollTime="1000" > <databases> <add name="PubsDB" connectionStringName="Pubs" /> </databases> </sqlCacheDependency> </caching> </system.web> El tiempo de sondeo indica la frecuencia con que la aplicacin comprueba si los datos han cambiado 4) Ahora ya se puede utilizar una dependencia SQL en la directiva OutputCache:

<%@ OutputCache Duration="999999" VaryByParam="none" %>

SqlDependency="Pubs:Authors"

O bien, indicarlo directamente en el control DataSource: <asp:SqlDataSource EnableCaching="true" SqlCacheDependency="PubsDB:Authors" ... /> CacheDuration="Infinite"

El siguiente ejemplo usa una cache de salida para un datasource de sql usando una notificacin basada en tablas. Observad el valor de fecha y hora al final de la aplicacin qu debera permanecer esttico. Puede usar el ejemplo del GridView para editar los datos. El refresco de la pgina debera actualizar los datos y poner un nuevo valor de fecha y hora

C#

SqlCacheDependency

Invalidacin Cach basada en Notificaciones de SQL Server 2005 Este mecanismo usa el mecanismo de notificacin de cambios en las consultas de SQL Server 2005 para detectar cambios en el resultados de las consultas. Al contrario que la invalidacin de SQL Server 7.0 y 2000 basado en los sondeos, esta invalidacin requiere mucho menos trabajo de configuracin. 1. Al contracin que en la validacin por sondeos, no se necesita indicar la entrada <sqlCacheDependency> en la configuracin de la aplicacin. Adems, tampoco hace falta una configuracin especial utilizando la herramienta aspnet_regsql.exe 2. Se configura una notificacin basada en dependencia de sql en la directiva OutputCache, utilizando la cadena CommandNotification. Este valor le indica a ASP.NET que se va a utilizar una dependencia basada en notificaciones Para la pgina: <%@ OutputCache Duration="999999" SqlDependency="CommandNotification" VaryByParam="none" %> 3. Para el control Datasource: <asp:SqlDataSource EnableCaching="true" SqlCacheDependency="CommandNotification" CacheDuration="Infinite" ... /> 4. 5. Se debe llamar al metodo System.Data.SqlClient.SqlDependency.Start() en algun lugar de la aplicacin antes de que se ejecute la primera consulta SQL. Esta llamada puede ponerse en el evento Application_Start() del fichero global.asax. para la pgina o un control DataSource

Siempre que un comando est relacionado con SQL Server 2005, ASP.NET y ADO.NET automticamente crearn una dependencia de cach que escuche las notificaciones de cambios enviados por SQL Server. Cuando se cambia un dato en SQL Server, esta notificacin provocar la invalidacin de las consultas en la cach del servidor web. La proxima vez que se solicite una pagina o control DataSource asociado con la dependencia, la pgina o el control sern ejecutados en vez de obtener la informacin del cach. Algunos puntos a tener encuenta para que las notificaciones funcionen correctamente son: 1. Las consultas deben indicar explicitamente los nombres de las columnas en la clausula Select. Si se usa "SELECT *" los resultados de la consulta no se registraran para las notificaciones de SQL 2005. 2. Los nombres de las tablas deben incluir el nombre del propietario. Por ejemplo, si quiere obtener una consulta de la tabla author de la base de datos pubs, la consultade debe referenciar a la tabla como "dbo.authors". 3. El usuario de SQL Server 2005 que est ejecutando la consulta tiene que tener permiso para registrar consultas para notificaciones. El siguiente comando Transact SQL otorga esos derechos : GRANT SUBSCRIBE QUERY NOTIFICATIONS TO username. 4. El usuario de SQL Server 2005 que est ejecutanto la consulta tambien tiene que tener derechos para enviar notificaciones desde SQL Server 2005. El siguiente comando Transact SQL otorga esos derechos: GRANT SEND ON SERVICE::SqlQueryNotificationService TO username. Nota: Hay un determinado nmero de restricciones en la sintaxis de las consultas SQL para soportar notificaciones. Para obtener la lista completa de restricciones, acudid al punto "Crear una consulta SQL para notificaciones" en los libros en linea de SQL Server 2005. Tambien, si nos encontramos con consultas que no son guardades en la cache y son ejecutadas en cada peticin de la pgina, es

probable que o bien no cumplan con las restricciones requeridas por SQL Server 2005 o bien que SQL Server 2005 est generando un error cuando intenta establecer las notificaciones para esas consultas. Actualmente, estas situaciones no producen ningun mensaje de error con el resultado final de que las dependencias de la cach son siempre no vlidas y, por tanto, cualquier consulta asociada se ejecuta siempre con cada peticin de pgina Configuracin de la Cach ASP.NET 2.0 incluye nuevas caractersticas para la configuracin de la cach<a name="profiles"> Perfiles de Cach Los perfiles de cach permiten que la configuracin de la cach para cientos de pginas sea implantada de forma central desde la configuracin. De forma individual las pginas siguen pudiendo sobreescribir la configuracin del perfil. especificndolo en la directiva <%@ OutputCache %>, pero por motivos de administracin podemos hacer que simplemente hereden la mayora o toda la configuracin del perfil de cach. En el siguiente ejemplo, la pgina utiliza un perfil de cach con el atributo CacheProfile, con la configuracin de la cach localizada en el perfil, en la seccin <outputcachesettings> del grupo de seccin de configuracin <caching>. C# Perfiles de Cach

<a name="properties"> Propiedades de la Cach en la Configuracin ASP.NET 2.0 incluye soporte para configurar la cuota de recursos utilizados para la cach. Las secciones de configuracin de la cach se dividen en 3 secciones de

nivel superior, contenidas en el grupo de seccin <caching>, que se incluye bajo <system.web>:

cache. Contiene la configuracin de la aplicacin referente a la cach, incluyendo el uso de memoria y las caractersticas deshabilitadas. outputCache. Contiene la configuracin de la aplicacin referentes a la cach de salida, incluyendo la deshabilitacin de la cach de salida o de fragmento.

outputCacheSettings. Contiene los ajustes de cach que pueden ser utilizados por las pginas/controles de la aplicacin y se pueden declarar en cualquier nivel.

Contains cache settings that can be used by individual pages/controls within the app and can be declared at any level.

Para ms detalles de la configuracin de la cach, podemos acudir a la documentacin de ASP.NET 2.0.

Potrebbero piacerti anche