ASP.NET und XHTML

Aktualisiert: November 2007

Mit ASP.NET können Sie Webseiten erstellen, die mit den XHTML-Standards konform sind. XHTML ist ein Standard des World Wide Web Consortium (W3C), der HTML als XML-Dokument definiert. Das Erstellen von Webseiten, die mit den XHTML-Standards konform sind, bietet mehrere Vorteile:

  • Es garantiert, dass die Elemente in den Seiten wohlgeformt sind.

  • Da viele Browser in immer stärkerem Maße zu XHTML übergehen, können Sie durch das Erstellen von Seiten, die mit den XHTML-Standards konform sind, sicherstellen, dass die Seiten in allen Browsern konsistent dargestellt werden.

  • Durch die Verwendung von XHTML lässt sich leichter Konformität der Seiten mit den Eingabehilfenstandards herstellen.

  • XHTML ist erweiterbar und lässt die Definition neuer Elemente zu.

  • Eine XHTML-Seite kann viel leichter programmgesteuert gelesen werden, was in Situationen sinnvoll ist, in denen eine Webseite nicht von einem Benutzer gelesen, sondern von einem Computer verarbeitet wird. Des Weiteren kann das Dokument mithilfe von Transformationen geändert werden.

Das W3C hat mehrere XHTML-Konformitätsebenen festgelegt: XHTML 1.0 Transitional, XHTML 1.0 Frameset, XHTML 1.0 Strict und XHTML 1.1. Die XHTML 1.1-Spezifikation ist die strengste Ebene. Die Spezifikationen XHTML 1.0 Frameset und XHTML 1.0 Transitional definieren XML-basiertes HTML-Markup, lassen jedoch bestimmte häufig verwendete Konstrukte zu. Viele bestehende Webseiten können mit den Spezifikationen XHTML 1.0 Frameset bzw. XHTML 1.0 Transitional konform gemacht werden. Um jedoch Konformität mit den Spezifikationen XHTML 1.0 Strict oder XHTML 1.1 herzustellen, bedürfen sie einer grundsätzlichen Überarbeitung, die die implementierte Funktionalität nicht zulässiger Konstrukte ersetzt.

Weitere Informationen zum XHTML-Standard finden Sie in der Spezifikation der Zweiten Ausgabe von XHTML 1.0 auf der W3C-Website.

ASP.NET-Features für XHTML-Konformität

In XHTML werden Elemente und Attributes strenger als in HTML definiert. Sämtliches Markup, das von ASP.NET und den mit ASP.NET gelieferten Webserversteuerelementen erzeugt wird, entspricht nun standardmäßig dem XHTML 1.0 Transitional-Standard. In vielen Fällen entspricht das von ASP.NET erzeugte Markup sogar dem XHTML 1.1-Standard. Falls nichts anderes angegeben ist, beziehen sich Verweise auf den XHTML-Standard in diesem Thema sowohl auf XHTML 1.0 als auch auf XHTML 1.1.

Zu den XHTML-Regeln, die von HTML abweichen, zählen unter anderem die Folgenden:

  • Alle Elemente beinhalten entweder ein explizites Endtag oder sind selbstschließend (mit />).

  • Tag- und Attributnamen werden in Kleinschreibung angezeigt, und Attributwerte werden in doppelte Anführungszeichen eingeschlossen. Wenn Sie auf der Seite zum Beispiel ein GridView-Steuerelement verwenden, gibt das GridView-Steuerelement bei der Wiedergabe der Seite HTML aus, das mit den XHTML-Standards übereinstimmt. Alle generierten Elemente verwenden explizite Start- und Endtags (oder selbstschließende Tags), und Attributwerte sind in doppelte Anführungszeichen eingeschlossen.

  • Zur Wiedergabe der Formatierungsinformationen werden nur CSS-Formate (Cascading Style Sheets) verwendet. Um diesen Standard zu unterstützen, wenn die Seite ein DOCTYPE-Element in XHTML enthält, geben die ASP.NET-Steuerelemente keine font-Elemente bzw. -Attribute wieder, z. B. bgcolor, die nicht mit den XHTML-Standards übereinstimmen würden.

  • Wenn Steuerelemente in ASP.NET IDs generieren, wie es beispielsweise bei Repeater und GridView der Fall ist, entspricht das Format der IDs den XHTML 1.0 Transitional-Richtlinien.

  • ASP.NET fügt dem form-Element dynamisch ein action-Attribut hinzu. Standardmäßig enthalten form-Elemente ein name-Attribut, was nach der XHTML 1.0 Transitional-Spezifikation zulässig ist. Dadurch kann die Abwärtskompatibilität mit vorhandenen Anwendungen gewahrt werden, die von Clientskript abhängig sind, das form-Elemente über den Formularnamen adressiert.

    Hinweis:

    Das name-Attribut im form-Element ist gemäß den XHTML 1.1-Richtlinien nicht zulässig. Sie können eine Anwendung so konfigurieren, dass name-Attribute nicht gerendert werden. Ausführliche Informationen finden Sie später in diesem Thema unter "Steuern des XHTML-Renderings von ASP.NET-Seiten und ASP.NET-Steuerelementen".

  • Da XHTML vorschreibt, dass alle Elemente in ein Containerelement eingeschlossen sein müssen, werden ASP.NET-Steuerelemente, wie zum Beispiel input-Elemente, in div-Elementen dargestellt. Dies schließt das HTML-Markup ein, das für Steuerelemente, z. B. das TextBox-Steuerelement, das CheckBox-Steuerelement und das RadioButton-Steuerelement, gerendert wird. Dazu gehören auch ausgeblendete Felder, wie zum Beispiel das Element, das zum Speichern der Ansichtszustandsdaten verwendet wird.

  • ASP.NET kodiert Zeichen, z. B. & (in diesem Fall als &). Dies schließt URLs ein, die generiert werden, um auf ECMAScript und den Inhalt kodierter Werte zu verweisen, z. B. den Ansichtszustand.

  • Sämtliche script-Elemente, die in der Seite gerendert werden, verwenden das passende type-Attribut (zum Beispiel type="type/javascript") und enthalten kein language-Attribut. Dies gilt auch für Skripts, die durch die Seite oder durch Steuerelemente erstellt wurden, die für die Ausführung eines Postbacks Clientskript benötigen, z. B. das HyperLink-Steuerelement, das LinkButton-Steuerelement, das Calendar-Steuerelement und das TreeView-Steuerelement sowie Validierungssteuerelemente. Es gilt aber auch für Skripts, die durch eine RegisterHiddenField-Methode, eine RegisterStartupScript-Methode oder eine RegisterClientScriptBlock-Methode erstellt wurden. Von Ihnen erstellte Skriptblöcke werden nicht automatisch mit type ergänzt.

  • Wenn ASP.NET Skriptblöcke rendert, wird der Inhalt der Skriptblöcke innerhalb eines XML (HTML)-Kommentars gerendert.

Steuern des XHTML-Renderings von ASP.NET-Seiten und ASP.NET-Steuerelementen

Unter bestimmten Umständen möchten Sie vielleicht, dass ASP.NET-Steuerelemente Markup gemäß dem strengeren Format der XHTML 1.1-Spezifikation rendern. Das Standardrendering enthält einige Markupelemente, die nicht der XHTML 1.1-Spezifikation entsprechen. Beispielsweise verbieten die XHTML 1.1-Standards die Verwendung eines name-Attributs in einem HTML-form-Element.

Umgekehrt möchten Sie an anderer Stelle vielleicht Markup rendern, das nicht den XHTML 1.0 Transitional-Spezifikationen entspricht. Dies ist in der Regel der Fall, wenn vorhandene Seiten Tags und Attribute verwenden, die in früheren ASP.NET-Versionen unterstützt wurden, jedoch nicht dem XHTML-Standard entsprechen.

Sie können eine Website auf drei verschiedene Arten für das Rendern von Markup konfigurieren:

  • Legacy (entspricht dem Rendering von Markup in früheren ASP.NET-Versionen)

  • Transitional (XHTML 1.0 Transitional)

  • Strict (XHTML 1.0 Strict)

Weitere Informationen hierzu finden Sie unter Gewusst wie: Konfigurieren des XHTML-Renderings in ASP.NET-Websites.

Hinweis:

Die Option zum Rendern von älterem Markup ist hauptsächlich dafür vorgesehen, die Migration vorhandener Seiten auf die aktuelle Version von ASP.NET zu unterstützen. Möglicherweise wird diese Option in zukünftigen Versionen von ASP.NET nicht mehr unterstützt.

Legacy-Rendering

Wenn das Rendering auf Legacy festgelegt ist, ändern ASP.NET-Seiten und -Steuerelemente ihr Renderverhalten in das Verhalten früherer Versionen von ASP.NET. Dies führt unter anderem zu folgenden Änderungen:

  • Das form-Element wird mit einem name-Attribut gerendert.

  • ASP.NET rendert nicht automatisch ein div-Element als Container für Steuerelemente innerhalb des form-Elements.

  • Validierungssteuerelemente werden als span-Elemente mit benutzerdefinierten Attributen, z. B. controltovalidate, gerendert.

  • Das img-Element rendert kein alt-Attribut und kein src-Attribut, wenn Sie diese Attribute nicht explizit einschließen.

  • Wenn die Unterstützung des automatischen Postbackverhaltens benötigt wird, rendern die Steuerelemente ein language-Attribut (zum Beispiel language="javascript").

  • Das nowrap-Attribut ist bei Steuerelementen enthalten, die ein div-Element rendern (z. B. das Panel-Steuerelement), wenn die Wrap-Eigenschaft des Steuerelements auf false festgelegt ist.

  • Die ImageButton-Steuerelemente rendern ein border-Attribut.

  • Alle in der Seite gerenderten br-Elemente werden als <br> gerendert. Wenn Sie jedoch explizit ein <br />-Tag einschließen, rendert die Seite dieses Element in unverändertem Zustand.

  • Das DataGrid-Steuerelement und das Calendar-Steuerelement schließen ein bordercolor-Attribut in die gerenderten table-Elemente ein, wenn die BackColor-Eigenschaft auf einen Wert festgelegt ist.

Angeben des DOCTYPE-Elements und des XHTML-Namespaces

Gültige XHTML-Webseiten müssen eine DOCTYPE-Deklaration enthalten, die die Seite als XHTML-Seite identifiziert und auf das XHTML-Schema verweist, mit dem die Seite konform ist. Die Seite muss auch Attribute für das HTML-Tag enthalten, das auf den XHTML-Namespace verweist. ASP.NET erstellt eine DOCTYPE-Deklaration nicht automatisch, wenn die Seite gerendert wird. Daher sollten Sie die DOCTYPE-Deklaration mit einem Verweis auf den entsprechenden XML-Namespace erstellen.

Hinweis:

Visuelle Designer wie Visual Studio enthalten im Allgemeinen Standardseitenvorlagen mit einer DOCTYPE-Deklaration. Wenn Sie einen visuellen Designer verwenden, stellen Sie sicher, dass er neue Seiten mit der erforderlichen DOCTYPE-Deklaration erstellt.

Das folgende Codebeispiel veranschaulicht eine DOCTYPE-Deklaration, die Sie der Seite hinzufügen könnten.

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

Wenn die DOCTYPE-Deklaration nicht automatisch generiert wird, verfügt ASP.NET über größere Renderingflexibilität für Browser, deren Konformität mit den verschiedenen HTML-Standards variiert, die in einer DOCTYPE-Deklaration angegeben werden können.

Hinweis:

Wenn die DOCTYPE-Deklaration entfernt wurde, kann XHTML-Konformität nicht erreicht werden. Die Seite wird dann nicht als XHTML-Seite betrachtet und verweist nicht auf das XHTML-Schema.

Viele Browser ändern ihr Rendering je nachdem, ob eine DOCTYPE-Deklaration und eine XML-Namespacedeklaration vorhanden sind oder nicht. Wenn diese Elemente vorhanden sind, verwenden Browser i. d. R. ein standardbasiertes Rendering. Sind diese Element nicht vorhanden, verwenden viele Browser zum Rendern browserspezifische Regeln. Diese variieren je nach Browsertyp (was manchmal als Rendering im "Quirksmodus" bezeichnet wird) und können infolgedessen zu unvorhersehbarem Verhalten beim Rendering führen.

Ebenso können Sie den MIME-Typ der Seite kontrollieren. Standardmäßig wird der MIME-Typ einer Seite auf text/html festgelegt. Sie können den MIME-Typ der Seite jedoch überschreiben, indem Sie das ContentType-Attribut in der @ Page-Direktive festlegen, wie im folgenden Codebeispiel gezeigt.

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

ASP.NET-Beispielseite mit erforderlichen XHTML-Elementen

Das folgende Codebeispiel veranschaulicht eine einfache ASP.NET-Seite, die mit XHTML konform ist.

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

Beachten Sie Folgendes:

  • Das form-Element enthält kein action-Attribut, da das action-Attribut beim Rendern der Seite hinzugefügt wird.

  • Die Formatierungseigenschaften des Label-Steuerelements werden als style-Attribute gerendert.

  • Da das script-Element, das Serverskript enthält, nicht für den Browser gerendert wird, ist kein type-Attribut erforderlich.

  • Die Seite rendert zur Laufzeit Clientskript, um das automatische Postbackverhalten des ListBox-Steuerelements zu ermöglichen. Das Skript wird von der Seite jedoch auf XHTML-kompatible Art und Weise gerendert.

XHTML-Konformität von statischem Text und HTML-Elementen

ASP.NET nimmt keine Änderungen an statischem Text oder an nicht für Server bestimmten HTML-Elementen vor, die Sie in eine Seite einfügen. Eine ASP.NET-Webseite könnte zum Beispiel das TextBox-Steuerelement und das Button-Steuerelement sowie statischen Text enthalten, den Sie eingeschlossen in <p></p>-Tags einfügen. ASP.NET kann für das TextBox-Steuerelement und das Button-Steuerelement XHTML rendern. Es kann jedoch keine XHTML-Fehler korrigieren, die innerhalb der <p></p>-Tags auftreten. Stellen Sie daher beim Erstellen von statischem Text oder HTML-Elementen sicher, dass der Text bzw. die Elemente XHTML-konform sind. Sie können die Seiten überprüfen, indem Sie sie validieren, wie im nächsten Abschnitt beschrieben.

Unbekannte Attribute von HTML-Steuerelementen werden zur dargestellten Steuerelementausgabe weitergeleitet und nicht als gültiger XHTML-Markup validiert. Durch Festlegen des ID-Attributs für das HtmlHead-Steuerelement wird beispielsweise Markup erzeugt, das nicht XHTML 1.0 Strict-konform ist. Verwenden Sie einen Markupvalidierungsdienst, wie z. B. den World Wide Web Consortium (W3C) Validation Markup Service, zum Validieren Ihres Markup.

Überprüfen der XHTML-Konformität von ASP.NET-Webseiten

Nach dem Erstellen von ASP.NET-Webseiten möchten Sie möglicherweise überprüfen, ob die Seiten korrektes XHTML rendern. Wenn die Seite ASP.NET-Webserversteuerelemente enthält, gibt es keine Möglichkeit, die Seite noch während des Schreibens zu überprüfen, da die Steuerelemente nur beim Ausführen der Seite XHTML rendern.

Hinweis:

Einige visuelle Designer, wie zum Beispiel Visual Studio, stellen Funktionen zur Verfügung, die eine XHTML-Validierung des Seitenmarkups bereits während der Entwurfszeit ermöglichen.

Um die Gültigkeit des von den Seiten erzeugten XHTML zu überprüfen, müssen Sie einen Dienst verwenden, der die Seite ausführt und die Ausgabe überprüft. Eine typische Strategie besteht darin, die Seiten auf einem öffentlich verfügbaren Server bereitzustellen. Der Server kann ein Testserver sein, es muss kein Produktionsserver sein. Der Server muss jedoch über das Internet erreichbar sein. Anschließend können Sie einen Validierungsdienst verwenden, der die Seiten programmgesteuert lesen kann.

Ein bekannter Dienst ist der W3C Markup Validation Service, der vom World Wide Web Consortium unterhalten wird. Um diesen Validierungsdienst zu verwenden, geben Sie den URL der Seite ein, die durch den Dienst geprüft werden soll. Die Validierungssite fordert die Seite an und erstellt einen Bericht mit sämtlichen Fehlern, die während der Validierung gefunden werden. Alternativ können Sie den Quelltext einer Webseite speichern und als Datei an den Validierungsdienst übermitteln. Weitere Informationen über diesen Validierungsdienst finden Sie auf der W3C-Website.

Wenn die zu überprüfende Seite dynamische Inhalte enthält oder wenn Benutzer Webseiten in Ihrer Site personalisieren können, müssen Sie sicherstellen, dass die Seiten mit verschiedenen Inhalten gestestet werden. Nur so stellen Sie sicher, dass alle möglichen Inhalte der Seite gültig sind. In einigen Fällen kann sich dies als schwierig erweisen, da die Bandbreite an unterschiedlichen Ausgabeseiten zu groß ist, um einen effektiven Test durchzuführen.

Konfigurieren von Browserfähigkeiten für Markupvalidierung

Beim Verarbeiten einer Seite untersucht ASP.NET die Anforderung auf Informationen zum aktuellen Browser und rendert das Markup entsprechend diesem Browser auf Grundlage des Browsertyps (Benutzeragententext). Weitere Informationen finden Sie unter ASP.NET-Webserversteuerelemente und Browserfunktionen.

Wenn Sie eine ASP.NET-Webseite an einen Validierungsdienst wie den W3C Markup Validation Service senden, rendert ASP.NET möglicherweise eine Version der Seite, die nicht den XHTML-Standards entspricht. Das liegt daran, dass der Validierungsdienst sich selbst nicht als Browsertyp meldet, der von ASP.NET erkannt wird, z. B. Internet Explorer oder Mozilla. Wenn ASP.NET den Browsertyp nicht erkennt, verwendet es standardmäßig Rendering für Downlevelmarkup, das keine XHTML-konformen Elemente und Attribute enthält bzw. Features wie Cascading Stylesheet-Formate nicht einschließt.

Sie können eine Anwendung so konfigurieren, dass korrektes, XHTML-konformes Markup an den Validierungsdienst gesendet wird, indem Sie eine Browserdefinition für den Benutzeragententext des Validierungsdiensts erstellen. Beispielsweise meldet der W3C Markup Validation Service einen Benutzeragenten, der mit "W3C_Validator" beginnt. Um eine Browserdefinition für den W3C-Validierungsdienst zu erstellen, können Sie im Verzeichnis App_Browsers der Anwendung eine BROWSER-Datei erstellen (der Name ist beliebig) und dann das folgende browsers-Element hinzufügen.

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

Weitere Informationen zum Erstellen von Browserdefinitionen finden Sie unter Schema der Browserdefinitionsdatei (browsers-Element).

Ausnahmen hinsichtlich der XHTML-Konformität

Obwohl ASP.NET XHTML-konformes Markup generiert, unterstützen einige Steuerelemente optionale Funktionen, deren Verwendung zu nicht konformem Markup führen kann.

Hinweis:

Jedes Steuerelement rendert sein eigenes Markup. Benutzerdefinierte Steuerelemente, die von anderen Anbietern erstellt wurden, sind möglicherweise nicht so geschrieben, dass sie XHTML-konforme Ausgaben erzeugen. Befragen Sie bei der Verwendung eines benutzerdefinierten Steuerelements den Anbieter, um zu bestimmen, welche Standards das Steuerelement unterstützt.

target-Attribut

Zu den Steuerelementen, die zu nicht konformem Markup führen können, zählen Steuerelemente, die das Einfügen eines target-Attributs zulassen, um ihr clientseitiges Verhalten anzugeben:

Seiten, die Steuerelemente mit festgelegtem target-Attribut enthalten, können nicht als XHMTL 1.1-konform validiert werden. Wenn Sie Seiten erstellen müssen, die vollständig den XHTML 1.1-Standards entsprechen, sollten Sie Optionen wie das target-Attribut, die zu nicht konformem Markup führen, nicht verwenden.

Select-Element

Mithilfe des DropDownList-Steuerelements oder des ListBox-Steuerelements kann eine Einfach- oder Mehrfachauswahl erstellt werden. Das DropDownList-Steuerelement und das ListBox-Steuerelement erstellen jeweils ein HTML select-Element. Wenn das DropDownList-Steuerelement oder das ListBox-Steuerelement nicht mindestens ein ListItem-Steuerelement enthält, verfügt das dargestellte select-Element über keine untergeordneten option-Elemente und kann nicht als XHTML 1.1-konform validiert werden.

Siehe auch

Aufgaben

Gewusst wie: Konfigurieren des XHTML-Renderings in ASP.NET-Websites