miércoles, 26 de marzo de 2008
Asignación dinámica de eventos a controles pertenecientes a controles compuestos.
Generalmente estos controles integrar un Repeater, que repite el control, por cada elemento dentro del DataBind de dicho Repeater.
Entonces basta con capturar el evento ItemCreated del Repeater. Cuando suceda, se busca el control compuesto y sus componentes. Y es en ese momento cuando ha de asignársele el evento a los sub controles que se deseen.
Generic Handlers
Un Generic Handler (GH) es otra clase de objeto que puede procesar http requests, sin necesidad de estar dentro del scope de una página (que está dirigida a presentar salidas de tipo HTML clásico). Un ejemplo de GH es el HTTP Handler. Como es bien sabido un http Handler se puede asociar a cualquier extensión de archivo (de acuerdo a lo permitido por el IIS). Los GH sin embargo, solo se pueden asociar a la extensión ASHX que está directamente soportada por los proyectos web en visual Studio 2005 y posteriores. Todos los Handlers implementan System.Web.IHttpHandler. Además, en IIS 7 se puede alojar cualquier Handler directamente.
El hecho que el GH pueda correr fuera del entorno de una página y aparte procesar HTTPRequests, lo hace una herramienta perfecta para ofrecer servicios de este tipo a otras aplicaciones, cuando no se han implementado como WebServices ya sea por requerimientos del negocio o requerimientos no funcionales.
Por qué puede no ser deseado un WebService?
Según la arquitectura y requerimientos de algunos clientes, es mejor recibir resultados a través de HTTPRequest "pelado", debido a que por ejemplo el llamado se hace desde una plataforma distinta a .NET desde la cual se hace bastante complejo crear un llamado a un WebService, tal vez porque la herramienta no puede manejar todos los tipos estándar en los WebServices (como sucede por ejemplo con PHP).
Entonces por qué no hacer una página Web Normal que responda a los llamados?
Si se crea una página aspx que responde a las peticiones se incurre en adicionales encabezados y todo el overhead adicional que genera la creación de una página completa (viewstate, etc), cuando en realidad solo se desea obtener una simple respuesta (una imágen un xml, etc).
Entonces para ganar performance y facilidad de administración en este tipo de funciones, es posible crear un Generic Handler sin dejar de atender al requerimiento de que la comunicación permanezca sencilla.
Entre los métodos obligatorios al estarse implementando IHttpHandler está ProcessRequest que es el que ejecuta el proceso requerido y por ende al fnal de su alcance habrá de tener un llamado a context.Response.Write o similar, que devuelva una respuesta http. Esta respuesta puede ser html, txt plano, imágenes, xml, etc.
Otra utilidad muy práctica es la de presentar objetos de memoria (entidades) en páginas WEB. La idea es tomar un objeto (serializable) en memoria que tenga representación XML. Se toma esta representación XML y se pasa por una transformación XSLT, produciéndose un HTML que representa a dicho objeto. Una de las aproximaciones para mostrar este HTML es grabarlo en un archivo y luego en otra página con un IFrame cargar dicho archivo. Pero como es obvio, el overhead de crear y borrar estos archivos físicos generados es absolutamente inaceptable. Otro enfoque es incluir en la página un control XML que muestre el objeto serializado y en el cual luego de hacer la transformación se vea el HTML como tal. Es una alternativa muy aceptable que a primera vista no tiene ninguna desventaja. Pero usando GH, se obtiene una control más directo sin el overhead que implica agregar un control XML a una página que además tendrá otros elementos que sumaran innecesariamente peso al resultado. Al crear un GH que tenga un tipo de respuesta XML, éste puede ser llamado (los GH se llaman como cualquier otra página aspx. Además también pueden aceptar parámetros: http://warnov.8m.com/miGH.ashx?param=valor;otroparam=otrovalor)a través de la su URL y el retorno obviamente será el HTML que representa al objeto deseado (siempre y cuando el XML incluya la directiva de transformación XSLT y el archivo XSLT se encuentre en la ruta que allí se especifica).
Como se observa, son muchas la aplicaciones que tienen estos objetos y es considerable la ganancia que se obtiene con su uso.