En mi anterior post sobre XHTML presentaba este estándar y cómo afectaba a nuestras aplicaciones HTML de toda la vida. Ahora vamos a ver cómo conseguir que nuestras aplicaciones ASP.NET 2.0 cumplan con este estándar.
Por defecto ASP.NET 2.0 genera XHTML 1.0 Transtional, en el que la mayor parte del HTML generado para los controles Web cumple con XHTML 1.1 pero que tiene ciertas características que hacen que no lo cumpla.
Existe una sencilla forma de configurar el entorno de ejecución para generar otros tipos de marcado más o menos compatibles (esto último puede ser interesante para migrar aplicaciones antiguas en ASP.NET 1.x).
Lo único que hay que hacer es configurar un nodo de tipo xhtmlConformance en nuestro web.config, así:
<system.web>
<xhtmlConformance
mode="strict" />
</system.web>
para conseguir marcado XHTML Strict, o bien:
<system.web>
<xhtmlConformance
mode="legacy" />
</system.web>
para que el HTML generado sea compatible con las versiones anteriores aunque no se comporte como marca XHTML. Si no incluimos este elemento se generará XHTML Transtional.
El modo Legacy
¿Qué deferencias con XHTML tiene el código generado en modo Legacy?. Pues según la documentación de Microsoft son las siguientes:
-
Los formularios incluyen el atributo name, explícitamente prohibido en XHTML, como hemos visto.
-
No se incluye un elemento <div> a continuación el elemento <form> para contener a todos los elementos y controles, cosa que sí ocurre en el modo normal.
-
Los controles de validación se renderizan como elementos <span> con atributos especiales.
-
Los elementos de imagen (<img>) no incluyen atributos 'alt' a menos que los incluyamos nosotros.
-
Se incluye el atributo 'language' en los elementos que tienen habilitado el Auto-post-back.
-
Se usa el atributo 'nowrap' en los elementos <div> cuya propiedad 'Wrap' sea 'false'.
-
Los botones ImageButton incluyen un atributo 'border'.
-
Los cambios de línea <br> no incluyen el cierre.
Excepciones
Incluso aunque utilicemos el modo 'strict' para conseguir XHTML 1.0 Strict hay excepciones en las que no seremos capaces de conseguir realmente una compatibilidad total.
Obviamente los controles que no sean nativos de ASP.NET 2.0 (es decir, que hayamos comprado a otras empresas) es probable que su HTML generado no cumpla con el estándar. Habrá que preguntarle al fabricante si ello es importante para nosotros.
Por otra parte todo el HTML estático que creemos nosotros y que no proceda de un control de servidor, así como los elementos que incluyamos dentro de controles de servidor Literal (pensados para mostrar su contenido inalterado), no se modifican en modo alguno. Por ello es necesario que tengamos cuidado por nuestra cuenta sobre lo que metemos en ellos, para que cumpla con el estándar deseado.
Una excepción más chocante es que algunos controles del propio ASP.NET no cumplen con XHTML aunque lo forcemos con el ajuste mencionado. Por ejemplo, algunos controles permiten ajustar una propiedad de su comportamiento que hace que se generen atributos 'target' en el HTML resultante, no cumpliendo entonces con XHTML. El más obvio de éstos es el control HyperLink, para crear enlaces, pero hay otros: HyperLinkColumn, AdRotator, MenuItem, TreeNode, ImageMap y BulletedList.
Los controles que generan una lista HTML (como por ejemplo el ListBox o el DropDownList), si no contienen elementos no generarán elementos <option> hijos, por lo que tampoco validarán contra XHTML 1.1.