Partager via


ASP.NET et XHTML

Mise à jour : novembre 2007

ASP.NET vous permet de créer des pages Web conformes aux standards XHTML. XHTML est une norme du World Wide Web Consortium (W3C) qui définit le langage HTML sous la forme d'un document XML. La création de pages Web conformes aux standards XHTML présente plusieurs avantages :

  • Elle garantit que les éléments des pages sont correctement formés.

  • Les navigateurs prenant de plus en plus fréquemment en charge le langage XHTML, la création de pages conformes aux standards XHTML permet de garantir que vos pages s'affichent de façon cohérente dans tous les navigateurs.

  • L'utilisation de XHTML permet de créer plus facilement des pages conformes aux standards d'accessibilité.

  • Le langage XHTML est extensible et autorise la définition de nouveaux éléments.

  • Une page XHTML est beaucoup plus facile à lire par programme si la page Web est traitée par ordinateur plutôt que lue par un utilisateur, et le document peut être manipulé à l'aide de transformations.

Le W3C a identifié plusieurs niveaux de conformité XHTML : XHTML 1.0 Transitional, XHTML 1.0 Frameset, XHTML 1.0 Strict et XHTML 1.1. La spécification XHTML 1.1 constitue le plus strict de ces niveaux. Les spécifications XHTML 1.0 Frameset et Transitional définissent un balisage HTML basé sur XML, mais autorisent certaines constructions largement utilisées. Nombre de pages Web existantes peuvent être rendues conformes aux spécifications XHTML 1.0 Frameset ou Transitional, mais ne peuvent pas satisfaire aux spécifications XHTML 1.0 Strict ou XHTML 1.1 sans nécessiter une révision substantielle afin de remplacer les fonctionnalités implémentées à l'aide de constructions non autorisées dans les caractéristiques.

Pour plus d'informations sur la norme XHTML, consultez la spécification de la deuxième édition de XHTML 1.0 sur le site Web du W3C.

Fonctionnalités ASP.NET pour la conformité XHTML

Le langage XHTML définit les éléments et les attributs de façon plus stricte que le langage HTML. Par défaut, tout le balisage produit par ASP.NET et les contrôles serveur Web inclus avec ASP.NET est désormais conforme au standard XHTML 1.0. Dans de nombreux cas, le balisage produit par ASP.NET se conforme également aux normes XHTML 1.1. Sauf indication contraire, les références au standard XHTML effectuées dans cette rubrique renvoient à XHTML 1.0 et XHTML 1.1.

Certaines règles XHTML diffèrent des règles HTML. Il s'agit notamment des règles suivantes :

  • Tous les éléments comprennent une balise de fermeture explicite ou sont de fermeture automatique (avec />).

  • Les noms de balises et d'attributs sont rendus en minuscules et les valeurs d'attributs sont encadrées par des guillemets doubles. Par exemple, si vous utilisez dans votre page un contrôle GridView, le contrôle GridView émet un code HTML conforme aux standards XHTML lorsque la page est rendue. Tous les éléments générés utilisent des balises d'ouverture et de fermeture explicites (ou des balises de fermeture automatique) et les valeurs d'attributs sont encadrées par des guillemets doubles.

  • Les informations de mise en forme sont rendues à l'aide de styles de feuille de style en cascade uniquement. Pour pouvoir prendre en charge cette norme, si la page inclut un élément DOCTYPE XHTML, les contrôles ASP.NET ne rendent pas les éléments ou les attributs font, tels que bgcolor, qui ne respectent pas les standards XHTML.

  • Dans ASP.NET, si les contrôles génèrent des ID, comme c'est le cas avec le contrôle Repeater, GridView et d'autres contrôles, le format de ces ID est conforme à la spécification XHTML 1.0 Transitional.

  • ASP.NET ajoute de façon dynamique un attribut action à l'élément form. Par défaut, les éléments form incluent un attribut name, autorisé dans la spécification XHTML 1.0 Transitional. Cela permet de conserver une compatibilité descendante avec les applications existantes qui reposent sur un script client adressant les éléments form à l'aide du nom de formulaire.

    Remarque :

    L'attribut name sur l'élément form n'est pas autorisé dans la spécification XHTML 1.1. Vous pouvez configurer votre application afin qu'elle ne restitue pas l'attribut name. Pour plus d'informations, consultez « Contrôle du rendu XHTML de pages et de contrôles ASP.NET », plus bas dans cette rubrique.

  • Dans la mesure où le langage XHTML exige que tous les éléments soient contenus dans un élément conteneur, les contrôles ASP.NET, tels que les éléments input, sont rendus dans des éléments div. Ceci inclut le balisage HTML rendu pour des contrôles, tels que les contrôles TextBox, CheckBox et RadioButton. Il en est de même pour les champs masqués, tels que l'élément utilisé pour stocker des données d'état d'affichage.

  • ASP.NET code les caractères, tels que & (par exemple, sous la forme &). Ceci inclut les URL générées pour référencer ECMAScript et le contenu de valeurs codées, comme l'état d'affichage.

  • Tous les éléments script rendus dans la page utilisent l'attribut type approprié (par exemple, type="type/javascript") et n'incluent pas d'attribut language. Cela concerne les scripts qui sont créés par la page ou les contrôles qui nécessitent que le script client exécute une publication (par exemple les contrôles HyperLink, LinkButton, Calendar et TreeView, ainsi que les contrôles validateurs) et par les méthodes RegisterHiddenField, RegisterStartupScript et RegisterClientScriptBlock. Les blocs de script que vous créez ne sont pas automatiquement modifiés avec un attribut type.

  • Si ASP.NET rend des blocs de script, leur contenu est rendu dans un commentaire XML (HTML).

Contrôle du rendu XHTML de pages et de contrôles ASP.NET

Dans certaines circonstances, vous pouvez souhaiter que les contrôles ASP.NET rendent le balisage dans le format plus strict spécifié par la spécification XHTML 1.1. Le rendu par défaut inclut certaines balises non conformes à la spécification XHTML 1.1. Par exemple, les standards XHTML 1.1 interdisent l'utilisation d'un attribut name dans un élément HTML form.

Inversement, vous pouvez souhaiter qu'ASP.NET restitue un balisage non conforme aux spécifications XHTML 1.0 Transitional. Cela est généralement vrai lorsque vous avez des pages reposant sur des balises ou des attributs qui étaient pris en charge dans les versions antérieures d'ASP.NET, mais ne se conforment pas aux standards XHTML.

Vous pouvez configurer votre site Web de façon à rendre le balisage de trois façons :

  • Legacy (Hérité) (option similaire à la façon dont le balisage était restitué dans les versions antérieures d'ASP.NET)

  • Transitional (XHTML 1.0 Transitional)

  • Strict (XHTML 1.0 strict)

Pour plus d'informations, consultez Comment : configurer le rendu XHTML dans des sites Web ASP.NET.

Remarque :

L'option permettant de rendre le balisage hérité (legacy) est fournie principalement pour vous aider à effectuer la migration de pages existantes vers la version actuelle d'ASP.NET. Elle ne sera peut-être pas prise en charge dans les futures versions d'ASP.NET.

Rendu hérité

Lorsque le rendu est défini comme hérité (legacy), les pages et les contrôles ASP.NET modifient leur comportement de rendu et adoptent celui des versions antérieures d'ASP.NET. Les modifications sont notamment les suivantes :

  • L'élément form est rendu avec un attribut name.

  • ASP.NET ne rend pas automatiquement un élément div à l'intérieur de l'élément form sous la forme d'un conteneur de contrôles.

  • Les contrôles validateurs sont rendus sous la forme d'éléments span avec des attributs personnalisés, tels que controltovalidate.

  • L'élément img ne rend pas les attributs alt et src, à moins que vous ne les incluiez explicitement.

  • S'il est nécessaire de prendre en charge le comportement de publication automatique, les contrôles rendront un attribut language (par exemple, language="javascript").

  • L'attribut nowrap est inclus pour les contrôles qui rendent un élément div (tel que le contrôle Panel) si la propriété Wrap du contrôle a la valeur false.

  • Les contrôles ImageButton rendent un attribut border.

  • Tous les éléments br rendus dans la page sont rendus sous la forme <br>. Toutefois, si vous incluez explicitement une balise <br />, la page la rend telle quelle.

  • Les contrôles DataGrid et Calendar incluent un attribut bordercolor dans les éléments table rendus si sa propriété BackColor est définie.

Spécification de l'élément DOCTYPE et de l'espace de noms XHTML

Les pages Web XHTML valides doivent contenir une déclaration DOCTYPE qui identifie la page comme une page XHTML et référence le schéma XHTML auquel elle se conforme. La page doit également inclure des attributs sur la balise HTML qui référencent l'espace de noms XHTML. ASP.NET ne crée pas automatiquement de déclaration DOCTYPE lorsque la page est rendue. Vous devez créer la déclaration DOCTYPE avec les références d'espace de noms XML appropriées.

Remarque :

Les concepteurs visuels, tels que Visual Studio, comportent généralement des modèles de page par défaut qui incluent une déclaration DOCTYPE. Si vous utilisez un concepteur visuel, vérifiez qu'il crée les nouvelles pages avec la déclaration DOCTYPE requise.

L'exemple de code suivant montre une déclaration DOCTYPE que vous pouvez ajouter à votre page.

<!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" >

En ne générant pas automatiquement la déclaration DOCTYPE, ASP.NET conserve une plus grande souplesse de rendu pour les navigateurs qui ont différents niveaux de conformité avec les différents standards HTML pouvant être spécifiés dans une déclaration DOCTYPE.

Remarque :

Si la déclaration DOCTYPE est supprimée, la conformité XHTML n'est pas satisfaite. La page n'est pas considérée comme page XHTML et ne référence pas le schéma XHTML.

Beaucoup de navigateurs modifient aussi leur rendu en fonction de la présence ou de l'absence de la déclaration DOCTYPE et d'une déclaration d'espace de noms XML. Si ces éléments sont présents, les navigateurs utilisent en général un rendu établi sur des standards. Lorsque les éléments ne sont pas présents, beaucoup de navigateurs effectuent le rendu avec des règles propres au navigateur et variant d'un type de navigateur à l'autre, ce qui peut se traduire par un rendu imprévisible.

De même, vous pouvez contrôler le type MIME de la page. Par défaut, une page affecte au type MIME la valeur text/html. Vous pouvez cependant substituer le type MIME de la page en définissant l'attribut ContentType dans la directive @ Page, comme le montre l'exemple de code suivant.

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

Exemple de page ASP.NET avec les éléments XHTML requis

L'exemple de code suivant montre une page ASP.NET simple conforme 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>

Notez les points suivants :

  • L'élément form ne contient pas d'attribut action, car l'attribut action est ajouté au moment du rendu de la page.

  • Les propriétés de mise en forme du contrôle Label sont rendues sous la forme d'attributs style.

  • L'élément script contenant le script serveur n'étant pas rendu au navigateur, il ne requiert pas d'attribut type.

  • La page rend le script client au moment de l'exécution pour activer le comportement de publication automatique du contrôle ListBox, mais elle le rend de façon compatible XHTML.

Conformité XHTML du texte statique et des éléments HTML

ASP.NET ne modifie pas le texte statique ou les éléments HTML non-serveur que vous placez dans une page. Par exemple, une page Web ASP.NET peut comprendre les contrôles TextBox et Button, ainsi que du texte statique ajouté entre les balises <p></p>. ASP.NET peut effectuer un rendu XHTML pour les contrôles TextBox et Button, mais il ne peut pas corriger les erreurs XHTML survenues entre les balises <p></p>. Si vous créez du texte statique ou des éléments HTML, assurez-vous qu'ils sont conformes XHTML. Vous pouvez vérifier vos pages en les validant, comme l'explique la section suivante.

Les attributs inconnus de contrôles HTML sont transmis à la sortie de contrôle rendue et ne sont pas validés comme balisage XHTML valide. Par exemple, la spécification de l'attribut ID pour le contrôle HtmlHead génère un balisage qui n'est pas strictement conforme à XHTML 1.0. Pour valider votre balisage, utilisez un validateur de balisage, tel que le service de validation du W3C (World Wide Web Consortium).

Vérification de la conformité XHTML des pages Web ASP.NET

Après avoir créé vos pages Web ASP.NET, vous pouvez vérifier si elles effectuent un rendu XHTML correct. Si la page contient des contrôles serveur ASP.NET, il n'existe aucun moyen de la vérifier en l'écrivant, car les contrôles n'effectuent le rendu XHTML que lorsque la page est exécutée.

Remarque :

Certains concepteurs visuels, comme Visual Studio, peuvent fournir une validation XHTML du balisage de la page au moment du design.

Pour vérifier la validité du code XHTML de vos pages, vous devez utiliser un service qui exécute la page et vérifie sa sortie. Une stratégie classique consiste à déployer vos pages sur un serveur publiquement disponible. Le serveur peut être un serveur de test, mais pas un serveur de production. Il doit en tout cas être ouvert à Internet. Vous pouvez ensuite utiliser un service de validation capable de lire vos pages par programme.

Un service couramment utilisé est le service de validation du W3C, géré par le World Wide Web Consortium. Pour utiliser ce validateur, entrez l'URL de la page que vous souhaitez faire vérifier par le service. Le site de validation demande la page et produit un rapport de toutes les erreurs qu'il rencontre. Vous pouvez aussi enregistrer la source d'une page Web et l'envoyer sous forme de fichier au service de validation. Pour plus d'informations sur ce service de validation, consultez le site Web du W3C.

Si la page que vous vérifiez contient du contenu dynamique, ou si les utilisateurs peuvent personnaliser des pages Web du site, vous devez tester les pages avec différents types de contenus pour garantir la validité de tout le contenu possible. Dans certains cas, cela pourra s'avérer difficile en raison d'une trop grande variabilité des sorties de pages, susceptible de compromettre l'efficacité des tests.

Configuration des fonctionnalités du navigateur pour la validation du balisage

Lors du traitement d'une page, ASP.NET examine les informations de la demande relatives au navigateur courant et, en fonction du type de navigateur (chaîne de l'agent utilisateur (user agent)), restitue le balisage approprié à ce navigateur. Pour plus d'informations, consultez Fonctionnalités des contrôles serveur Web ASP.NET et du navigateur.

Si vous soumettez une page Web ASP.NET à un service de validation comme celui du W3C, ASP.NET peut afficher une version de la page non conforme aux standards XHTML. Cela est dû au fait que le service de validation ne se présente pas comme type de navigateur reconnu par ASP.NET, comme Internet Explorer ou Mozilla. Quand ASP.NET ne peut pas reconnaître le type de navigateur, il restitue par défaut le balisage de bas niveau, lequel ne comporte pas d'attributs et d'éléments conformes à XHTML ou des caractéristiques comme les feuilles de style en cascade.

Vous pouvez configurer votre application de façon à envoyer le balisage conforme à XHTML au service de validation en créant une définition de navigateur pour la chaîne de l'agent utilisateur (user agent) du service de validation. Par exemple, le service de validation du W3C signale un agent utilisateur (user agent) commençant par "W3C_Validator". Pour créer une définition de navigateur pour le validateur W3C, vous pouvez créer un fichier .browser dans le dossier App_Browsers de votre application (vous pouvez appeler le fichier .browsers ou choisir un tout autre nom), puis ajouter l'élément browsers suivant.

<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>

Pour plus d'informations sur la création de définitions de navigateur, consultez Schéma du fichier de définition de navigateur (élément browsers).

Exceptions à la conformité XHTML

Bien qu'ASP.NET génère un balisage XHTML conforme, certains contrôles prennent en charge des fonctionnalités facultatives qui, en cas d'utilisation, peuvent entraîner un balisage non conforme.

Remarque :

Chaque contrôle rend son propre balisage. Les contrôles personnalisés créés par des tiers peuvent ne pas être écrits pour produire une sortie conforme XHTML. Si vous utilisez un contrôle personnalisé, contactez son fournisseur pour connaître les standards qu'il accepte.

Attribut Target

Les exemples de contrôles qui peuvent entraîner un balisage non conforme sont les contrôle qui vous permettent d'inclure un attribut target pour spécifier leur comportement côté client :

Les pages qui incluent les contrôles avec leur ensemble d'attributs target ne peuvent pas être validées par rapport à XHTML 1.1. S'il est essentiel pour vous de créer des pages 100 % conformes avec les standards XHTML 1.1, évitez d'utiliser les options, comme l'attribut target, qui entraînent un balisage non conforme.

Sélection d'un élément

Un contrôle DropDownList ou ListBox peut être utilisé pour créer une sélection multiple ou unique. Les contrôles DropDownList et ListBox restituent chacun un élément select HTML. Si le contrôle DropDownList ou ListBox ne contient pas au moins un contrôle ListItem, l'élément select rendu ne contient pas d'éléments option enfants et ne sera pas validé par rapport à XHTML 1.1.

Voir aussi

Tâches

Comment : configurer le rendu XHTML dans des sites Web ASP.NET