ASP.NET と XHTML

更新 : 2007 年 11 月

ASP.NET では、XHTML 標準に準拠する Web ページを作成できます。XHTML は HTML を XML ドキュメントとして定義する W3C (World Wide Web Consortium) 標準です。XHTML 標準に準拠する Web ページを作成することには、いくつかの利点があります。

  • ページ内の要素が整形式であることが保証されます。

  • 多くのブラウザが XHTML をサポートする方向に向かっているので、XHTML 標準に準拠することにより、作成するページをどのブラウザにでも一貫して表示できます。

  • XHTML を使用することにより、アクセシビリティ標準に準拠したページをより簡単に作成できます。

  • XHTML は拡張可能で、新しい要素を定義できます。

  • Web ページがユーザーによって参照されるのではなくコンピュータによって処理される場合は、XHTML ページはプログラムによる読み込みの方がはるかに容易であり、変換を使用してドキュメントを操作できます。

W3C は、XHTML 準拠レベルとして XHTML 1.0 Transitional、XHTML 1.0 Frameset、XHTML 1.0 Strict、および XHTML 1.1 を認定しています。この中では XHTML 1.1 が最も厳密な仕様です。XHTML 1.0 Frameset と XHTML 1.0 Transitional は XML ベースの HTML マークアップを定義しますが、広く使用されている特定の構造を許可します。多くの既存の Web ページは、XHTML 1.0 Frameset 仕様または XHTML 1.0 Transitional 仕様に準拠させることができますが、XHTML 1.0 Strict 仕様または XHTML 1.1 仕様に準拠させるには、これらの仕様では許可されない構造を使用して実装されている機能を置き換える必要があり、大幅な変更が必要となります。

XHTML 標準の詳細については、W3C Web サイト の XHTML 1.0 第 2 版の仕様を参照してください。

XHTML に準拠するための ASP.NET 機能

XHTML は HTML より厳密に要素と属性を定義します。既定では、ASP.NET、および ASP.NET に含まれる Web サーバー コントロールが生成するすべてのマークアップは XHTML 1.0 Transitional 標準に準拠します。多くの場合、ASP.NET によって生成されるマークアップは XHTML 1.1 標準にも準拠しています。特に明記されていない限り、このトピックでは XHTML 標準とは XHTML 1.0 と XHTML 1.1 の両方を意味します。

HTML と異なる XHTML の規則の一部を次に示します。

  • すべての要素には明示的な終了タグがあるか、または /> によって自己終了します。

  • タグと属性名は小文字でレンダリングされ、属性値は二重引用符で囲まれます。たとえば、GridView コントロールを使用するページをレンダリングすると、GridView コントロールは XHTML 標準に準拠した HTML を生成します。生成されるすべての要素は、明示的な開始タグと終了タグまたは自己終了タグを使用し、属性値は二重引用符で囲まれます。

  • 書式指定の情報は、カスケード スタイル シートのスタイルのみを使用してレンダリングされます。この標準をサポートするために、ページに XHTML DOCTYPE 要素が指定されている場合、ASP.NET コントロールは XHTML 標準に準拠しない bgcolor などの font 要素または属性はレンダリングしません。

  • ASP.NET で RepeaterGridView などのコントロールが ID を生成する場合、その ID の形式は XHTML 1.0 Transitional ガイドラインに準拠します。

  • ASP.NET は、form 要素に action 属性を動的に追加します。既定では、form 要素には XHTML 1.0 Transitional 仕様で許可されている name 属性が含まれています。これにより、フォーム名を使用して form 要素を解決するクライアント スクリプトに依存する既存のアプリケーションとの下位互換性が保持されています。

    exc57y7e.alert_note(ja-jp,VS.90).gifメモ :

    form 要素の name 属性は XHTML 1.1 ガイドラインでは許可されていません。name 属性をレンダリングしないようにアプリケーションを構成できます。詳細については、このトピックで後述する「ASP.NET ページとコントロールの XHTML レンダリングの制御」を参照してください。

  • XHTML では、すべての要素をコンテナ要素に入れる必要があるので、input 要素などの ASP.NET コントロールは div 要素でレンダリングされます。これには、TextBoxCheckBoxRadioButton などのコントロールにレンダリングされる HTML マークアップが含まれます。また、ビューステート データを格納するために使用する要素などの隠しフィールドも含まれます。

  • ASP.NET では、文字がエンコードされます。たとえば、& は & にエンコードされます。これには、ECMAScript およびビューステートなどのエンコードされた値の内容を参照するために生成される URL が含まれます。

  • ページにレンダリングされるすべての script 要素は、type="type/javascript" などの適切な type 属性を使用し、language 属性は含みません。これは、HyperLink、LinkButtonCalendarTreeView の各コントロール、検証コントロールなどのクライアント スクリプトがポストバックを実行することを必要とするページやコントロールによって作成されるスクリプト、および RegisterHiddenField、RegisterStartupScript、RegisterClientScriptBlock の各メソッドによって作成されるスクリプトについて該当します。ユーザーが作成したスクリプト ブロックは、type 属性を使用した自動的な修正は行われません。

  • ASP.NET がスクリプト ブロックをレンダリングすると、スクリプト ブロックの内容は XML (HTML) コメント内にレンダリングされます。

ASP.NET ページとコントロールの XHTML レンダリングの制御

ASP.NET コントロールで XHTML 1.1 仕様のより厳密な形式でマークアップをレンダリングすることが必要な場合があります。既定のレンダリングには、XHTML 1.1 仕様に準拠していないマークアップも含まれています。たとえば、XHTML 1.1 標準では、HTML form 要素の name 属性の使用は禁止されています。

反対に、ASP.NET で XHTML 1.0 Transitional 仕様に準拠しないマークアップをレンダリングすることが必要な場合もあります。典型的な例は、ASP.NET の以前のバージョンでサポートされ、XHTML 標準には準拠していないタグまたは属性に依存する既存のページがある場合です。

Web サイトによるマークアップのレンダリング方法には、次の 3 つの方法があります。

  • Legacy (以前のバージョンの ASP.NET でのマークアップのレンダリング方法とほぼ同じ)

  • Transitional (XHTML 1.0 Transitional)

  • Strict (XHTML 1.0 Strict)

詳細については、「方法 : ASP.NET Web サイトで XHTML レンダリングを構成する」を参照してください。

exc57y7e.alert_note(ja-jp,VS.90).gifメモ :

レガシ マークアップをレンダリングするオプションは、主に既存のページを ASP.NET の最新バージョンに移行するために提供されているので、ASP.NET の将来のバージョンではサポートされなくなる可能性があります。

レガシ レンダリング

レンダリングをレガシに設定すると、ASP.NET のページとコントロールは、レンダリング機能を ASP.NET の以前のバージョンの動作に変更します。次のような変更が行われます。

  • form 要素は、name 属性を使用してレンダリングされます。

  • ASP.NET では、form 要素の内部の div 要素はコントロールのコンテナとして自動的にレンダリングされません。

  • 検証コントロールは、controltovalidate などのカスタム属性を使用して span 要素としてレンダリングされます。

  • img 要素では、alt 属性と src 属性はそれらを明示的に含めない限りレンダリングされません。

  • 自動ポストバック機能をサポートする必要がある場合、コントロールは language="javascript" などの language 属性をレンダリングします。

  • コントロールの Wrap プロパティが false に設定されている場合、div 要素をレンダリングする Panel などのコントロールに nowrap 属性が追加されます。

  • ImageButton コントロールは、border 属性をレンダリングします。

  • br 要素は、すべて <br> としてページにレンダリングされます。ただし、明示的に <br /> タグを記述すると、そのままレンダリングされます。

  • BackColor プロパティが設定されている場合、DataGrid コントロールと Calendar コントロールには、レンダリングされた table 要素に bordercolor 属性が含まれます。

DOCTYPE 要素と XHTML 名前空間の指定

有効な XHTML Web ページには、XHTML としてページを識別し、準拠する XHTML スキーマの参照を指定する DOCTYPE 宣言を記述する必要があります。ページには、XHTML 名前空間を参照する HTML タグの属性も含める必要があります。ASP.NET は、ページがレンダリングされるときに DOCTYPE 宣言を自動的に作成しません。DOCTYPE 宣言は、ユーザーが適切な XML 名前空間への参照を使用して作成する必要があります。

exc57y7e.alert_note(ja-jp,VS.90).gifメモ :

Visual Studio などのビジュアルなデザイナには、通常、DOCTYPE 宣言を含む既定のページ テンプレートが含まれています。ビジュアルなデザイナを使用する場合は、必要な DOCTYPE 宣言を含む新しいページが作成されることを確認します。 詳細についてはVisual Web Developer での XHTML およびVisual Web Developer での XHTML およびVisual Web Developer での XHTML.

ページに追加する DOCTYPE 宣言のコード例を次に示します。

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

DOCTYPE 宣言を自動的に生成しないことにより、ASP.NET では、DOCTYPE 宣言で指定できるさまざまな HTML 標準へのさまざまな準拠レベルのブラウザに対して、柔軟性の高いレンダリングが保たれます。

exc57y7e.alert_note(ja-jp,VS.90).gifメモ :

DOCTYPE の宣言が削除されると、XHTML の準拠には適合しません。ページは XHTML ページとして扱われず、XHTML スキーマを参照しません。

多くのブラウザでも、DOCTYPE 宣言と XML 名前空間宣言の有無により、レンダリングが変わります。これらの要素が存在する場合、ブラウザは通常、標準ベースのレンダリングを行います。これらの要素が存在しない場合、多くのブラウザが、ブラウザの種類によって異なるブラウザ固有の規則を使用してレンダリング ("互換捻出モード" でのレンダリングとも呼ばれます) を行います。そのため、予測不能な結果が生じることがあります。

同様にして、ページの MIME タイプを制御できます。既定では、ページの MIME タイプは text/html に設定されます。ただし、次のコード例に示すように、@ Page ディレクティブの ContentType 属性を設定すると、ページの MIME タイプをオーバーライドできます。

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

必要な XHTML 要素を含む ASP.NET ページの例

XHTML に準拠する簡単な ASP.NET ページのコード例を次に示します。

<%@ 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 runat="server">
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 runat="server">
  <title>ASP.NET XHTML Page</title>
</head>

<body>
  <form id="Form1" runat="server">
    <div>
      <h1>ASP.NET Sample Page for XHTML</h1>
      <p>
      <asp:listbox runat="server" 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 runat="server" id="Label1" ForeColor="white" 
          BackColor="black" />
      <br />
      <asp:button runat="server" 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 runat="server">
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 runat="server">
  <title>ASP.NET XHTML Page</title>
</head>
<body>
  <form id="Form1" runat="server">
    <div>
      <h1>ASP.NET Sample Page for XHTML</h1>
      <p>
      <asp:listbox runat="server" 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 runat="server" id="Label1" ForeColor="white" 
          BackColor="black" />
      <br />
      <asp:button runat="server" id="Button1" onclick="Button1_Click" 
          Text="Click me"/>
    </div>
  </form>
</body>
</html>

次の点に注意してください。

  • ページがレンダリングされるときに action 属性が追加されるので、form 要素に action 属性は含まれていません。

  • Label コントロールの書式指定プロパティは、style 属性にレンダリングされます。

  • サーバー スクリプトを含む script 要素はブラウザにレンダリングされないので、type 属性は必要ありません。

  • ページは、実行時にクライアント スクリプトをレンダリングして、ListBox コントロールの自動ポストバックを有効にします。ただし、スクリプトは XHTML 互換でレンダリングされます。

静的テキストと HTML 要素の XHTML 準拠

ASP.NET は、静的テキストやサーバー HTML 以外の要素は変更しません。たとえば、ASP.NET Web ページに TextBox コントロールと Button コントロール、および <p></p> タグの内部に静的テキストがあるとします。ASP.NET は、TextBox コントロールと Button コントロールの XHTML をレンダリングしますが、<p></p> タグの間の XHTML エラーは検出できません。静的テキストや HTML 要素を作成する場合は、XHTML に準拠していることが必要です。次のセクションで説明する方法を使用してページをチェックできます。

HTML コントロールの未知の属性がレンダリングされたコントロールの出力に渡され、有効な XHTML マークアップとして検証されません。たとえば、HtmlHead コントロールの ID 属性を指定すると、XHTML 1.0 に厳密に準拠していないマークアップになります。マークアップを検証するには、W3C (World Wide Web Consortium) Validation Markup Service などのマークアップ検証コントロールを使用します。

ASP.NET Web ページの XHTML 準拠のチェック

ASP.NET Web ページを作成した後に、XHTML が正しくレンダリングされるかどうかのチェックが必要な場合があります。ページに ASP.NET Web サーバー コントロールが含まれる場合、コントロールはページが実行されたときに XHTML をレンダリングするので、ページの記述中にはチェックできません。

exc57y7e.alert_note(ja-jp,VS.90).gifメモ :

Visual Studio などのビジュアル デザイナを使用すると、デザイン時にページのマークアップに対する XHTML の検証ができます。

ページの XHTML の有効性をチェックするには、ページを実行して出力をチェックするサービスを使用する必要があります。通常は、一般に使用できるサーバーにページを配置します。サーバーは運用サーバーである必要はなく、テスト サーバーでもかまいません。ただし、インターネットに公開されている必要があります。次に、ページをプログラムによって読み込むことができる検証サービスを使用します。

一般に使用されるサービスは、World Wide Web Consortium で管理されている W3C Markup Validation Service です。この検証機能を使用するには、チェックするページの URL を入力します。検証サイトはページを要求し、見つかったエラーのレポートを生成します。または、Web ページのソースを保存し、検証サービスにファイルとして送信することもできます。この検証サービスの詳細については、W3C Web サイト を参照してください。

チェックするページに動的なコンテンツが含まれる場合、またはユーザーがサイトで Web ページをパーソナル化できる場合は、異なる内容を使用してページをテストし、可能なすべての内容が有効であることを確認する必要があります。ページの出力が多様すぎて、十分に効果的なテストを実施するのが困難な場合があります。

マークアップ検証に対するブラウザ機能の構成

ページの処理中、ASP.NET は、要求に含まれる現在のブラウザに関する情報を確認し、そのブラウザの種類 (ユーザー エージェント文字列) に基づいて、そのブラウザに合ったマークアップをレンダリングします。詳細については、「ASP.NET Web サーバー コントロールとブラウザの機能」を参照してください。

ASP.NET Web ページを、W3C Markup Validation Service などの検証サービスに送信する場合、ASP.NET は、XHTML 標準に準拠しないバージョンのページをレンダリングする可能性があります。これは、この検証サービスが、Internet Explorer や Mozilla など、ASP.NET が認識するブラウザの種類として自身を報告しないためです。ASP.NET がブラウザの種類を認識できない場合、既定では、下位レベルのマークアップがレンダリングされます。これには、XHTML 準拠の要素、属性、またはカスケード スタイル シートなどの機能は含まれません。

検証サービスのユーザー エージェント文字列用にブラウザ定義を作成することで、検証サービスに XHTML 準拠の正しいマークアップを送信するようにアプリケーションを構成できます。たとえば、W3C Markup Validation Service は、"W3C_Validator" で始まるユーザー エージェントを報告します。W3C 検証コントロールのブラウザ定義を作成するには、アプリケーションの App_Browsers フォルダに任意の名前でブラウザ ファイルを作成し、次の 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>

ブラウザ定義の作成の詳細については、「ブラウザ定義ファイルのスキーマ (browsers 要素)」を参照してください。

XHTML 準拠の例外

ASP.NET は XHTML 準拠のマークアップを生成しますが、一部のコントロールでサポートされているオプションの機能で、XHTML 準拠ではないマークアップが生成されることがあります。

exc57y7e.alert_note(ja-jp,VS.90).gifメモ :

各コントロールは、それぞれのマークアップをレンダリングします。サードパーティによって作成されたカスタム コントロールは、XHTML 標準に準拠した出力を生成しないことがあります。カスタム コントロールを使用する場合は、コントロールがサポートしている標準を販売元に確認してください。

target 属性

非準拠マークアップが生成されるコントロールには、target 属性によりクライアント側の動作を指定できる次のようなコントロールがあります。

target 属性が設定されているコントロールを含むページは、XHTML 1.1 に準拠していません。XHTML 1.1 標準に完全に準拠したページを作成する必要がある場合は、非準拠マークアップになる target 属性などのオプションを使用しないでください。

select 要素

DropDownList コントロールまたは ListBox コントロールを使用して、単一または複数のアイテム選択を作成できます。DropDownList コントロールと ListBox コントロールはそれぞれ HTML select 要素をレンダリングします。DropDownList コントロールまたは ListBox コントロールに ListItem コントロールがまったく含まれていない場合、レンダリングされた select 要素には子の option 要素がなく、これは XHTML 1.1 に違反します。

参照

処理手順

方法 : ASP.NET Web サイトで XHTML レンダリングを構成する