Compartir a través de


ASP.NET y XHTML

Actualización: noviembre 2007

ASP.NET permite crear páginas Web compatibles con los estándares de XHTML. XHTML es un estándar de World Wide Web Consortium (W3C) que define HTML como un documento XML. La creación de páginas Web compatibles con estándares de XHTML tiene varias ventajas:

  • Garantiza que los elementos en las páginas están bien formados.

  • Dado que cada vez más exploradores incorporan la compatibilidad XHTML, la creación de páginas compatibles con dichos estándares ayuda a garantizar que las páginas se representen de forma uniforme en todos los exploradores.

  • La utilización de XHTML ayuda a que las páginas se ajusten con más rapidez a los estándares de accesibilidad.

  • XHTML es ampliable, ya que permite definir nuevos elementos.

  • Una página XHTML es mucho más fácil de leer mediante programación en aquellas situaciones en las que la página Web es procesada por un equipo en lugar de ser leída por los usuarios, además es posible manipular el documento utilizando transformaciones.

W3C ha identificado varios niveles de compatibilidad con XHTML: XHTML 1.0 Transitional, XHTML 1.0 Frameset, XHTML 1.0 Strict y XHTML 1.1. La especificación XHTML 1.1 es la más estricta de estos niveles. Las especificaciones XHTML 1.0 Frameset y Transitional definen el formato HTML basado en XML, pero permiten ciertas construcciones ampliamente utilizadas. Muchas páginas Web existentes se pueden hacer compatibles con las especificaciones XHTML 1.0 Frameset o Transitional, pero no cumplen con las especificaciones XHTML 1.0 Strict o XHTML 1.1 sin pasar antes por una revisión importante para reemplazar la funcionalidad implementada mediante construcciones que no están permitidas en las especificaciones.

Para obtener más información sobre el estándar XHTML, vea la especificación para la segunda edición de XHTML 1.0 en el sitio Web de W3C.

Características de ASP.NET para la compatibilidad con XHTML

XHTML define los elementos y los atributos de una forma más estricta que HTML. De forma predeterminada, todo el marcado generado por ASP.NET y los controles de servidor Web incluidos con ASP.NET ahora es compatible con el estándar XHTML 1.0 Transitional. En muchos casos, el marcado generado por ASP.NET también es compatible con los estándares XHTML 1.1. A menos que se indique lo contrario, las referencias al estándar de XHTML en este tema se refieren a XHTML 1.0 y XHTML 1.1.

Entre las reglas de XHTML que difieren de HTML se incluyen las siguientes:

  • Todos los elementos incluyen una etiqueta de cierre explícita o son de autocierre (con />).

  • Los nombres de las etiquetas y los atributos se representan en minúsculas, y los valores de los atributos se encierran entre comillas. Por ejemplo, si utiliza un control GridView en una página, cuando ésta se representa, el control GridView emite código HTML compatible con los estándares de XHTML. Todos los elementos generados utilizan etiquetas de apertura y de cierre explícitas (o etiquetas de autocierre), y los valores de los atributos están entre comillas.

  • La información de formato se representa utilizando sólo estilos de hojas de estilo en cascada. Para garantizar la compatibilidad con este estándar, si la página incluye un elemento DOCTYPE de XHTML, los controles ASP.NET no representan los elementos o atributos font, como bgcolor, que no serían compatibles con los estándares de XHTML.

  • En ASP.NET, si los controles generan identificadores, tal y como ocurre en los controles Repeater y GridView, entre otros, el formato de dichos identificadores coincide con las instrucciones de XHTML 1,0.

  • ASP.NET agrega dinámicamente un atributo action al elemento form. De forma predeterminada, los elementos de form incluyen un atributo name, que se permite en la especificación de XHTML 1.0 Transitional. Esto ayuda a mantener la compatibilidad entre versiones anteriores y las aplicaciones existentes que confían en la secuencia de comandos de cliente que direcciona elementos de form mediante el nombre del formulario.

    Nota:

    El atributo name en el elemento form no está permitido en las instrucciones de XHTML 1.1. Puede configurar su aplicación para que no represente un atributo name. Para obtener detalles, vea "Controlar la representación XHTML de las páginas y los controles ASP.NET" más adelante en este tema.

  • Dado que XHTML requiere que todos los elementos estén en un elemento contenedor, los controles ASP.NET como los elementos input se representan en elementos div. Esto incluye el formato HTML representado para controles como TextBox, CheckBox y RadioButton. También incluye campos ocultos, como el elemento utilizado para almacenar la información de estado de vista.

  • ASP.NET codifica ciertos caracteres, como & (por ejemplo, como &). Esto incluye las direcciones URL generadas para hacer referencia a ECMAScript y el contenido de los valores codificados, como el estado de vista.

  • Los elementos script que se representan en la página utilizan el atributo type apropiado (por ejemplo, type="type/javascript") y no incluyen ningún atributo language. Esto afecta a las secuencias de comandos creadas por la página o a los controles que requieren una secuencia de comandos de cliente para realizar una devolución de datos, como los controles HyperLink, LinkButton, Calendar y TreeView, y los controles de validación, así como a las creadas por los métodos RegisterHiddenField, RegisterStartupScript y RegisterClientScriptBlock. Los bloques de secuencias de comandos que cree no se corrigen automáticamente con un atributo type.

  • Si ASP.NET representa los bloques de secuencia de comandos, el contenido de los bloques de secuencia de comandos se representa dentro de un comentario XML (HTML).

Controlar la representación XHTML de las páginas y los controles ASP.NET

Bajo algunas circunstancias, tal vez desee que los controles ASP.NET representen el marcado en el formato más estricto especificado por XHTML 1.1. La representación predeterminada incluye algún marcado que no sea compatible con la especificación XHTML 1.1. Por ejemplo, los estándares XHTML 1.1 prohíben el uso de un atributo name en un elemento form de HTML.

Al contrario, tal vez desee que ASP.NET represente un marcado que no sea compatible con las especificaciones de XHTML 1.0 Transitional. Generalmente, esto suele suceder cuando existen páginas basadas en etiquetas o atributos compatibles con versiones anteriores de ASP.NET, pero que no se ajustan a los estándares XHTML.

Puede configurar su sitio Web para que represente el marcado de tres maneras:

  • Heredado (que es similar a como se representó el marcado en versiones anteriores de ASP.NET)

  • De transición (XHTML 1.0 Transitional)

  • Estricto (XHTML 1.1)

Para obtener más información, vea Cómo: Configurar la representación XHTML en sitios Web ASP.NET.

Nota:

La opción para representar marcado heredado se incluye principalmente para ayudarle en la migración de páginas existentes a la versión actual de ASP.NET y es posible que no se mantenga en futuras versiones de ASP.NET.

Representación heredada

Cuando la representación se establece como heredada, la representación de las páginas y los controles ASP.NET sufre algunos cambios y adopta el comportamiento de versiones anteriores de ASP.NET. Entre los cambios se encuentran los siguientes:

  • El elemento form se representa con un atributo name.

  • ASP.NET no representa automáticamente un elemento div dentro del elemento form como contenedor para los controles.

  • Los controles de validación se representan como elementos span con atributos personalizados, como controltovalidate.

  • El elemento img no representa los atributos alt y src, a menos que se incluyan de forma explícita.

  • Si fuera necesario por motivos de compatibilidad con el comportamiento de la devolución de datos automática, los controles representarán un atributo language (por ejemplo, language="javascript").

  • El atributo nowrap se incluye para los controles que representan un elemento div (como el control Panel) si la propiedad Wrap del control se establece en false.

  • Los controles ImageButton representan un atributo border.

  • Los elementos br representados en la página se presentan como <br>. Sin embargo, si se incluye de forma explícita una etiqueta <br />, la página la representa tal y como está.

  • Los controles DataGrid y Calendar incluyen un atributo bordercolor en los elementos table representados si se establece el valor de su propiedad BackColor.

Especificar el elemento DOCTYPE y el espacio de nombres XHTML

Las páginas Web XHTML válidas deben contener una declaración DOCTYPE que identifique la página como una página XHTML y haga referencia al esquema XHTML con el que es compatible. La página también debe incluir atributos en la etiqueta HTML que hagan referencia al espacio de nombres XHTML. ASP.NET no crea automáticamente una declaración DOCTYPE al representar la página. Corresponde al desarrollador la tarea de crear la declaración DOCTYPE con las referencias adecuadas al espacio de nombres XML.

Nota:

Los diseñadores visuales, como Visual Studio, generalmente incluyen plantillas de página predeterminadas que incluyen una declaración DOCTYPE. Si está utilizando un diseñador visual, compruebe que crea las nuevas páginas con la declaración DOCTYPE que necesite.

En el ejemplo de código siguiente se muestra una declaración DOCTYPE que podría agregar a su página.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >

Al no generar la declaración DOCTYPE automáticamente, ASP.NET retiene una mayor flexibilidad de representación para los exploradores que tienen distintos niveles de compatibilidad con los distintos estándares HTML que se pueden especificar en una declaración DOCTYPE. Muchos exploradores también cambiarán su representación según la presencia o ausencia de la declaración DOCTYPE y una declaración del espacio de nombres XML. Si esos elementos están presentes, los exploradores utilizan normalmente una representación basada en estándares. Cuando los elementos no están presentes, muchos exploradores se representan mediante reglas específicas del explorador que varían entre los distintos tipos de exploradores (lo que a veces se conoce como representación en modo "quirks"), y por lo tanto puede dar como resultado una representación impredecible.

De manera similar, puede controlar el tipo MIME de la página. De forma predeterminada, una página establece el tipo MIME en text/html. Sin embargo, dicho tipo se puede reemplazar estableciendo el atributo ContentType en la directiva @ Page, tal como se muestra en el ejemplo de código siguiente.

<%@ Page Language="VB" ContentType="application/xhtml+xml" %>
<%@ Page Language="C#" ContentType="application/xhtml+xml" %>

Página ASP.NET de ejemplo con los elementos XHTML necesarios

En el ejemplo de código siguiente se muestra una página ASP.NET sencilla compatible con XHTML.

<%@ Page Language="VB" AutoEventWireup="false" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<script >
Sub Button1_Click(sender As Object, e As EventArgs)
    Label1.Text = "Built at " & DateTime.Now.ToString()
End Sub

Sub listFruit_SelectedIndexChanged(sender As Object, e As EventArgs)
    Label1.Text = "You selected " & listFruit.SelectedItem.Text
End Sub
</script>

<head >
  <title>ASP.NET XHTML Page</title>
</head>

<body>
  <form id="Form1" >
    <div>
      <h1>ASP.NET Sample Page for XHTML</h1>
      <p>
      <asp:listbox  id="listFruit" AutoPostBack="true" 
          onselectedindexchanged="listFruit_SelectedIndexChanged">
         <asp:listitem>Apple</asp:listitem>
         <asp:listitem>Banana</asp:listitem>
         <asp:listitem>Orange</asp:listitem>
      </asp:listbox>
      </p>
      <asp:label  id="Label1" ForeColor="white" 
          BackColor="black" />
      <br />
      <asp:button  id="Button1" onclick="Button1_Click" 
          Text="Click me"/>
    </div>
  </form>
</body>
</html>
<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script >
void Button1_Click(Object sender, EventArgs e)
{
    Label1.Text = "Built at " + DateTime.Now.ToString();
}
void listFruit_SelectedIndexChanged(Object sender, EventArgs e)
{
    Label1.Text = "You selected " + listFruit.SelectedItem.Text;
}
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head >
  <title>ASP.NET XHTML Page</title>
</head>
<body>
  <form id="Form1" >
    <div>
      <h1>ASP.NET Sample Page for XHTML</h1>
      <p>
      <asp:listbox  id="listFruit" AutoPostBack="true" 
          onselectedindexchanged="listFruit_SelectedIndexChanged">
         <asp:listitem>Apple</asp:listitem>
         <asp:listitem>Banana</asp:listitem>
         <asp:listitem>Orange</asp:listitem>
      </asp:listbox>
      </p>
      <asp:label  id="Label1" ForeColor="white" 
          BackColor="black" />
      <br />
      <asp:button  id="Button1" onclick="Button1_Click" 
          Text="Click me"/>
    </div>
  </form>
</body>
</html>

Tenga en cuenta lo siguiente:

  • El elemento form no contiene un atributo action debido a que el atributo action se agrega al representar la página.

  • Las propiedades de formato del control Label se representarán como atributos style.

  • Debido a que el elemento script que contiene la secuencia de comandos de servidor no se representa en el explorador, no requiere un atributo type.

  • La página representa la secuencia de comandos de cliente en tiempo de ejecución para habilitar el comportamiento de la devolución de datos automática del control ListBox, pero la representa de forma que sea compatible con XHTML.

Compatibilidad del texto estático y de los elementos HTML con XHTML

ASP.NET no modifica el texto estático ni los elementos HTML que no sean del servidor existentes en una página. Por ejemplo, una página Web ASP.NET podría incluir los controles TextBox y Button, así como texto estático que se haya agregado dentro de etiquetas <p></p>. ASP.NET puede representar el marcado XHTML para los controles TextBox y Button, pero no puede corregir los errores de XHTML existentes entre las etiquetas <p></p>. Si opta por crear texto estático o elementos HTML, asegúrese de que son compatibles con XHTML. Puede comprobar las páginas que haya creado validándolas, tal como se explica en la sección siguiente.

Comprobar la compatibilidad de las páginas Web ASP.NET con XHTML

Una vez creadas las páginas Web ASP.NET, es conveniente comprobar si pueden representar código XHTML correctamente. Si una página contiene controles de servidor Web ASP.NET, no es posible realizar la comprobación durante su creación, ya que los controles sólo representan el código XHTML cuando se ejecuta la página.

Nota:

Algunos diseñadores visuales, como Visual Studio, pueden proporcionar validación de XHTML en tiempo de diseño del marcado de la página.

Para comprobar la validez del código XHTML utilizado en sus páginas, debe utilizar un servicio que ejecute la página y compruebe su resultado. Una estrategia típica es implementar las páginas en un servidor que esté disponible públicamente. El servidor puede ser un servidor de pruebas; no tiene que ser un servidor de producción. Sin embargo, debe estar conectado a Internet. A continuación puede utilizar un servicio de validación que pueda leer las páginas mediante programación.

Un servicio popular es el W3C Markup Validation Service, al que mantiene el World Wide Web Consortium. Para poder utilizar este servicio de validación, escriba la dirección URL de la página que desea que el servicio compruebe. El sitio de validación solicita la página y genera un informe con los errores que encuentra. Opcionalmente, puede guardar el código fuente de una página Web y enviarlo como un archivo al servicio de validación. Para obtener más información sobre este servicio de validación, visite el sitio Web de W3C.

Si la página que está comprobando incluye contenido dinámico o si los usuarios pueden personalizar las páginas Web de su sitio, asegúrese de probar páginas con todos los tipos de contenido posibles para garantizar su validez. En algunos casos, esto puede resultar difícil debido a que el elevado número de resultados posibles de la página impedirá realizar las pruebas de forma eficaz.

Configurar las funciones del explorador para la validación del marcado

Cuando se procesa una página, ASP.NET examina la información de la solicitud sobre el explorador actual y basándose en el tipo de explorador (cadena de agente de usuario), representa el marcado que es apropiado para dicho explorador. Para obtener más información, vea Controles de servidor Web ASP.NET y funciones del explorador.

Si envía una página Web ASP.NET a un servicio de validación como, por ejemplo, W3C Markup Validation Service, ASP.NET podría representar una versión de la página que no sea compatible con los estándares de XHTML. Esto es porque el servicio de validación no se presenta como un tipo de explorador que ASP.NET reconozca como, por ejemplo, Internet Explorer o Mozilla. Cuando ASP.NET no puede reconocer el tipo de explorador, toma como valor predeterminado la representación de marcado a bajo nivel, la cual no incluye elementos y atributos compatibles con XHTML, o características como estilos de hojas de estilo en cascada.

Puede configurar su aplicación para que envíe el marcado compatible con XHTML correcto al servicio de validación mediante la creación de una definición de explorador para la cadena de agente de usuario del servicio de validación. Por ejemplo, el W3C Markup Validation Service informa de un agente de usuario que comienza con "W3C_Validator." Para crear una definición de explorador para el control de validación W3C, puede crear un archivo .browser en la carpeta App_Browsers de la aplicación (puede dar el nombre que prefiera al archivo .browsers) y después agregar el siguiente elemento browsers.

<browsers>
  <browser id="W3C_Validator" parentID="default">
    <identification>
        <userAgent match="^W3C_Validator" />
    </identification>
    <capabilities>
      <capability name="browser"              value="W3C Validator" />
      <capability name="ecmaScriptVersion"    value="1.2" />
      <capability name="javascript"           value="true" />
      <capability name="supportsCss"          value="true" />
      <capability name="tables"               value="true" />
      <capability name="tagWriter" 
         value="System.Web.UI.HtmlTextWriter" />
      <capability name="w3cdomversion"        value="1.0" />
    </capabilities>
  </browser>
</browsers>

Para obtener más información acerca de cómo crear definiciones de explorador, vea Esquema de archivos de definición de explorador (Elemento browsers).

Excepciones a la compatibilidad con XHTML

Aunque ASP.NET genere un marcado compatible con XHTML, algunos controles admiten una funcionalidad opcional que, si se utiliza, podría generar un marcado no compatible.

Nota:

Cada control representa su propio marcado. Es posible que los controles personalizados creados por terceros no estén diseñados para generar resultados compatibles con XHTML. Si utiliza un control personalizado, consulte al proveedor del control los estándares que admite.

Atributo Target

Ejemplos de controles que pueden generar marcado no compatible son los controles que permiten incluir un atributo target para especificar su comportamiento en el cliente:

Las páginas que incluyan controles que tengan establecido el atributo target no se podrán validar con XHTML 1.1. Es de suma importancia que cree páginas que sean 100% compatibles con los estándares XHTML 1.1 y debe evitar utilizar opciones, como el atributo target, que generan un marcado incompatible.

Elemento Select

El control ListBox puede utilizarse para crear una selección de un solo elemento o de varios elementos. El control ListBox representa un elemento HTML select. Si el control ListBox no contiene al menos un control ListItem, el elemento select representado no contiene elementos option secundarios y no se validarán con XHTML 1.1.

Vea también

Tareas

Cómo: Configurar la representación XHTML en sitios Web ASP.NET