共用方式為


ASP.NET 和 XHTML

更新:2007 年 11 月

ASP.NET 可以讓您建立符合 XHTML 標準的 Web 網頁。XHTML 是將 HTML 定義為 XML 文件的全球資訊網協會 (W3C) 標準。建立符合 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 和 Transitional 規格會定義 XML 架構的 HTML 標記,但允許某些廣泛使用的建構。許多現有的 Web 網頁可以符合 XHTML 1.0 Frameset 或 Transitional 規格,但是,若沒有相當的修訂來取代使用規格中不允許之建構所實作的功能,則無法滿足 XHTML 1.0 Strict 或 XHTML 1.1 規格。

如需 XHTML 標準的詳細資訊,請參閱 W3C 網站上 XHTML 1.0 第二版的規格。

符合 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 標準的 font 項目或屬性,例如 bgcolor。

  • 在 ASP.NET 中,如果控制項產生 ID (如同出現在 RepeaterGridView 和其他控制項中),則 ID 的格式會符合 XHTML 1.0 Transitional 方針。

  • ASP.NET 會以動態方式將 action 屬性加入 form 項目。根據預設,form 項目包含 name 屬性,在 XHTML 1.0 Transitional 規格中允許使用此屬性。這可幫助維護現有應用程式的回溯相容性 (Backward Compatibility),這些應用程式則會依賴於使用表單名稱指出 form 項目的用戶端指令碼。

    注意事項:

    form 項目上的 name 屬性在 XHTML 1.1 方針中不允許使用。您可以將應用程式設定為不呈現 name 屬性。如需詳細資訊,請參閱本主題稍後的「控制 ASP.NET 網頁和控制項的呈現」。

  • 因為 XHTML 要求將所有項目放在容器項目中,所以像是 input 項目的 ASP.NET 控制項就會呈現在 div 項目中。其中包括為控制項呈現的 HTML 標記,例如 TextBoxCheckBoxRadioButton 控制項。其也包含隱藏欄位,例如用來儲存檢視狀態資料的項目。

  • ASP.NET 會編碼字元,如 & (例如,編碼為 &)。其中包含產生以參考 ECMAScript 的 URL 和編碼值內容,例如檢視狀態。

  • 呈現至網頁的任何 script 項目會使用適當的 type 屬性 (例如 type="type/javascript"),並且不會包含 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 標準的標記或屬性時,通常會發生這種情況。

您可以將網站設定為以下列三種方法呈現標記:

  • 舊版 (類似於在舊版 ASP.NET 中呈現標記的方式)

  • Transitional (XHTML 1.0 Transitional)

  • Strict (XHTML 1.0 Strict)

如需詳細資訊,請參閱 HOW TO:在 ASP.NET 網站中設定 XHTML 呈現

注意事項:

呈現舊版標記的選項的主要用意在於協助您將現有的網頁移轉至目前的 ASP.NET 版本,且未來的 ASP.NET 版本可能不會支援這項功能。

舊版呈現

當呈現設為舊版時,ASP.NET 網頁和控制項會將其呈現變更為 ASP.NET 先前版本的行為。變更包含下列各項:

  • form 項目會使用 name 屬性呈現。

  • ASP.NET 不會自動將 form 項目中的 div 項目呈現為控制項的容器。

  • 會使用自訂屬性將驗證程式控制項呈現為 span 項目,例如 controltovalidate。

  • 除非您明確包含這些屬性,否則 img 項目不會呈現 alt 和 src 屬性。

  • 如果需要支援自動回傳行為,控制項會呈現 language 屬性 (例如 language="javascript")。

  • 如果控制項的 Wrap 屬性設定為 false,nowrap 屬性會包含在呈現 div 項目的控制項中 (例如 Panel 控制項)。

  • ImageButton 控制項呈現 border 屬性。

  • 呈現至網頁的任何 br 項目都會呈現為 <br>。然而,如果您明確包含 <br /> 標記,網頁就會依原本的方式呈現它。

  • DataGridCalendar 控制項會將 bordercolor 屬性包含在呈現的 table 項目中 (如果其設定 BackColor 屬性)。

指定 DOCTYPE 項目和 XHTML 命名空間

有效的 XHTML Web 網頁必須包含 DOCTYPE 宣告,以便將網頁識別為 XHTML 網頁並且參考其符合的 XHTML 結構描述。網頁也必須包含參考 XHTML 命名空間的 HTML 標記屬性。當呈現網頁時 ASP.NET 不會自動建立 DOCTYPE 宣告。而是應該使用適當的 XML 命名空間參考建立 DOCTYPE 宣告。

注意事項:

視覺化設計工具 (Visual Designer) (例如 Visual Studio) 通常包括其中含有 DOCTYPE 宣告的預設網頁範本。如果正在使用視覺化設計工具,請檢查它是以您要求的 DOCTYPE 宣告建立新網頁。

下列程式碼範例顯示可以加入網頁的 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 標準。

注意事項:

如果移除 DOCTYPE 宣告,則無法符合 XHTML 的規範,因此網頁無法被視為是 XHTML 網頁,也就不會參考 XHTML 結構描述。

許多瀏覽器也會根據是否存在 DOCTYPE 宣告和 XML 命名空間宣告,變更它們的呈現。如果存在這些項目,瀏覽器通常就會使用標準型呈現。當這些項目不存在時,許多瀏覽器會使用因瀏覽器類型而不同的瀏覽器專屬規則來呈現 (有時會以「突變模式」(Quirks Mode) 呈現),因而會導致無法預測的呈現。

同樣地,您可以控制網頁的 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 >
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>

請注意以下各點:

  • form 項目不會包含 action 屬性,因為當呈現網頁時會加入 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) 驗證標記服務 (英文)。

檢查 ASP.NET Web 網頁的 XHTML 一致性

在建立 ASP.NET Web 網頁後,您可能想要檢查其是否會呈現正確的 XHTML。如果網頁包含 ASP.NET Web 伺服器控制項,則撰寫時就無法檢查網頁,因為只有在網頁執行時控制項才會呈現 XHTML。

注意事項:

某些像是 Visual Studio 的視覺化設計工具能夠提供網頁標記的設計階段 XHTML 驗證。

若要檢查網頁的 XHTML 有效性,您必須使用執行網頁並檢查輸出的服務。一般的策略是將網頁部署至可公開使用的伺服器。這個伺服器就可以當做測試伺服器;不需要使用實際執行的伺服器。然而,它必須開放給網際網路使用。然後就可以使用以程式設計方式讀取網頁的驗證服務。

目前流行的服務是 W3C Markup Validation Service,這是由全球資訊網協會所維護。若要使用這個驗證程式,請輸入想要讓服務檢查的網頁 URL。驗證站台會要求網頁,並且根據找到的任何錯誤產生報表。此外,您可以儲存 Web 網頁的原始程式,然後以檔案方式送出至驗證服務。如需此驗證服務的詳細資訊,請參閱 W3C 網站

如果檢查的網頁包含動態內容,或是如果使用者可以在您的網站中個人化站台中的 Web 網頁,您就必須確定使用不同的內容測試網頁,以確定網頁中所有可能的內容都是有效的。這在一些情況中可能會有困難,因為可能網頁輸出中的變化太多以致於無法有效測試。

設定標記驗證的瀏覽器功能

處理網頁時,ASP.NET 會檢查目前瀏覽器相關要求的資訊,並根據瀏覽器類型 (使用者代理字串) 呈現適合該瀏覽器的標記。如需詳細資訊,請參閱 ASP.NET Web 伺服器控制項和瀏覽器能力

如果將 ASP.NET Web 網頁送出至 W3C Markup Validation Service 這類驗證服務,ASP.NET 可能會呈現不符合 XHTML 標準的網頁版本。這是因為驗證程式服務不會將自己報告為 ASP.NET 可辨識的瀏覽器類型,例如 Internet Explorer 或 Mozilla。當 ASP.NET 無法辨識瀏覽器類型時,預設會呈現下層標記,其中不包含符合 XHTML 標準的項目和屬性,或者階層樣式表樣式這類功能。

您可以對驗證服務的使用者代理字串建立瀏覽器定義,就可以將應用程式設定為將符合 XHTML 標準的正確標記傳送至驗證服務。例如,W3C Markup Validation Service 會報告出以 "W3C_Validator" 開頭的使用者代理字串。若要對 W3C 驗證程式建立瀏覽器定義,您可以在應用程式的 App_Browsers 資料夾中建立瀏覽器檔案 (可以任意命名 .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 的輸出。如果您使用這些廠商所提供的自訂控制項,請洽詢控制項供應商以判斷控制項支援那些標準。

Target 屬性

可能產生不相容標記的控制項範例是指,讓您納入 target 屬性以指定其用戶端行為的控制項:

包含具有 target 屬性集之控制項的網頁不會針對 XHTML 1.1 進行驗證。如果對您來說建立 100% 符合 XHTML 1.1 標準的網頁十分重要的話,則應該避免使用會產生不符標準之標記的選項,例如 target 屬性。

Select 項目

DropDownListListBox 控制項可以用來建立單一項目或多重項目選取。DropDownListListBox 控制項各自會呈現 HTML select 項目。如果 DropDownListListBox 控制項沒有至少包含一個 ListItem 控制項,則呈現的 select 項目不會包含任何 option 子項目,也不會針對 XHTML 1.1 進行驗證。

請參閱

工作

HOW TO:在 ASP.NET 網站中設定 XHTML 呈現