Control Adapters en .NET 2 o superior

Los controles de .NET porque te facilitan la tarea de programar y ha supuesto una ayuda importante para controlar la renderización de HTML de los webcontrols de .NET.

Con .NET te olvidas casi por completo que existen los comandos Request.Form o Request.QueryString porque se ven sustituidos por los controladores de eventos.

No obstante, tienen un handicap que el renderizado viene con el sello de fábrica Microsoft y con el HTML markup que han decidido sin tomar en cuenta la validación de HTML o la accesibilidad.

Para los que trabajamos con niveles de accesibilidad AAEste enlace abre una nueva ventana esto supone una tortura porque la doble AA por ejemplo no te permite incluir inline el width o dejar etiquetas style etc...

El programador avispado soluciona este problema creando un control que herede del control original de .NET , se utiliza un render con un override y solucionado, más o menos así:

public class AccessibleImageButton : System.Web.UI.WebControls.ImageButton
{ 
protected override void Render(HtmlTextWriter output) { 

System.Text.StringBuilder sb = new System.Text.StringBuilder(); 
System.IO.StringWriter sw = new System.IO.StringWriter(sb, System.Globalization.CultureInfo.CurrentCulture);
HtmlTextWriter mywriter = new HtmlTextWriter(sw); 
base.Render(mywriter); 
mywriter.Close();
sw.Close();
string s = sb.ToString(); s = s.Replace("style=\"border-width:0px;\"", String.Empty); output.Write(s); 
} 
}

Desde luego este tipo de código es totalmente válido e inevitable si además queremos añadirle funcionalidades nuevas al control.

Por ejemplo, si queremos que las rutas de una imagen vaya a una carpeta determinada dependiendo si una sesión "contraste" se ha activado, y si no, a otra para imágenes normales.

El problema de esta approach es que debemos sustituir los controles imagebutton en este caso por el control customizado.

Desde .NET 2 se ha creado un nuevo mecanismo built-in, que son los "control adapters".

Estos controladores te permite crear, digamos, un plug-in para cualquier control de servidor, y modificarlo para cambiar su lógica de renderizado.

¿Cuál es la ventaja?

Es menos engorroso y sobre todo, se hace a un nivel global dentro de la web.

¿Cómo funcionan los control adapters?

Se utiliza un nuevo tipo de archivo de extensión ".browser" que se coloca en la carpeta "App_browsers" que hará que se produzca el override de los controles que se especifique automáticamente para todo el sitio web:

appbrowsers

El código necesario por ejemplo para reescribir el renderizado de un ImageButton sería el siguiente: Archivo ".browser" dentro de carpeta App_Browsers:

<browsers> <browser refID="Default"> <controlAdapters> <adapter controlType="System.Web.UI.WebControls.ImageButton" adapterType="ImageButtonControlAdapter" /> </controlAdapters> </browser> </browsers>

En dicho archivo se hace referencia a una clase del adaptador llamado ImageButtonControlAdapter, pero podéis llamarlo a vuestro gusto.

Normalmente incluiríamos dicha clase en App_Code pero también se puede poner en un proyecto aparte:

public class ImageButtonControlAdapter : System.Web.UI.Adapters.ControlAdapter
{ 
protected override void Render(System.Web.UI.HtmlTextWriter output) { 
System.Text.StringBuilder sb = new System.Text.StringBuilder();
System.IO.StringWriter sw = new System.IO.StringWriter(sb, System.Globalization.CultureInfo.CurrentCulture);
HtmlTextWriter mywriter = new HtmlTextWriter(sw); 
base.Render(mywriter); mywriter.Close(); 
sw.Close(); 
string s = sb.ToString(); 
s = s.Replace("style=\"border-width:0px;\"", String.Empty);
 output.Write(s); 
} }

En este caso lo que estamos haciendo es buscar un estilo que se inserta automáticamente en los ImageButton y que no podemos dejar si queremos cumplir el nivel AA de accesibilidad web.

La conclusión es que los Control Adapters son mucho mejores que realizar un control solo para arreglar problemas de estilo.

Escrito el 11 ene 2009
comments powered by Disqus

« App_offline.htm mientras estás actualizando - The base class includes the field 'X', but its type is not compatible »