XHTML 和 MIME 類型 – 使用Web 標準產生 ASP.NET 2.0 Web 網站~

來源:互聯網
上載者:User
當 網頁瀏覽器從 Web 服務器請求頁時,Web 服務器會為該頁分配特定的 MIME 類型(也稱為 Content 類型)。例如,HTML 頁被分配為 text/html MIME 類型,GIF 映像被分配為 image/gif MIME 類型,而 Microsoft Word 文檔被分配為 application/msword MIME 類型。

瀏覽器使用 MIME 類型來確定如何處理頁(或其他資源)。例如,如果瀏覽器從 Web 服務器獲得一個具有可識別映像 MIME 類型的檔案,則瀏覽器嘗試將該檔案解釋並呈現為映像。如果瀏覽器獲得一個具有 application/msword MIME 類型的檔案,則該瀏覽器可能自動開啟 Microsoft Word 以顯示該文檔(這裡的確切行為取決於瀏覽器及其配置方式)。

W3C 為 XHTML 文檔引入了一個 MIME 類型。這一新的 MIME 類型是 application/xhtml+xml。W3C 建議您在提供 XHTML 文檔時使用 application/xhtml+xml MIME 類型,因為 XHTML 頁應該以比舊式 HTML 頁更嚴格的方式進行解釋。

通過在頁指令中包含 ContentType 屬性,為 ASP.NET 頁分配特定的 MIME 類型。例如,在 ASP.NET 頁的頂部包含以下指令會導致為該頁分配 application/xhtml+xml 類型。

程式碼<%@ ContentType="application/xhtml+xml" %>

W3C 的推薦標準有一個突出問題:並非所有瀏覽器都能識別 application/xhtml+xml。特別需要指出的是,Internet Explorer(有史以來最為流行的 網頁瀏覽器)不能識別 application/xhtml+xml MIME 類型。因此,使用推薦的 application/xhtml+xml MIME 類型提供 XHTML 頁不是一個可行的選擇。

有三種解決該問題的方式。可以使用 text/html MIME 類型來提供 XHTML 頁,或者使用 application/xml(或 text/xml)MIME 類型來提供 XHTML 頁,也可以使用內容協商方式。讓我們對上述每個選擇進行探討。

第一個選擇 — 以 text/html 類型提供頁 — 是最容易的選擇。預設情況下,ASP.NET 頁被分配為該 MIME 類型。更好的做法是,按照 W3C 的建議,在向現有的 HTML 瀏覽器提供頁時使用這一選擇(請參閱 http://www.w3.org/TR/xhtml-media-types/)。如果建立的是 XHTML 1.0 Transitional 頁,並且 Web 應用程式的主要受眾使用不能理解 application/xhtml+xml MIME 類型的瀏覽器,那麼以 text/html 類型提供頁似乎十分明智。畢竟,引入 XHTML 1.0 Transitional 標準的目的是使開發人員能夠更為容易地將現有的 HTML 頁遷移到 XHTML。

這一主張是有爭議的。例如,Ian Hickson 認為,絕不應該以 text/html 類型提供 XHTML 頁,因為這樣會導致隨便的、不標準的 XHTML 頁(請參閱 http://hixie.ch/advocacy/xhtml)。他建議作者們繼續堅持使用 HTML 4.0,直到更多的瀏覽器完全支援 XHTML 標準為止。

第二個選擇是使用 application/xml 或 text/xml MIME 類型,以 XML 類型提供 XHTML 頁。在向 Internet Explorer 提供 XML 文檔時,該文檔會作為 XML 文檔進行分析並呈現到瀏覽器中。(該文檔由 document.XMLDocument 對象公開的 XML DOM 表示。)

以 XML 類型提供 XHTML 文檔的優點是,XHTML 文檔具有的任何問題都會被 Internet Explorer 的 XML 分析器捕獲。例如,如果文檔包含重疊標記,或者如果沒有將屬性的值封裝到引號內,則不會呈現該文檔,並且會顯示錯誤資訊(參見圖 4)。XHTML 純粹主義者認為該行為是一件好事,因為它可以防止您編寫格式錯誤的 XHTML。

圖 4. 在 Internet Explorer 中顯示 XML

該方法的問題是:預設情況下,Internet Explorer 呈現 XML 文檔的原始碼。因此,如果以 XML 類型提供 XHTML 文檔,則 Web 網站訪問者將看到 XHTML 文檔的原始碼,而不是預期的呈現輸出。W3C 推薦了一個用來解決該問題的“竅門”(請參閱 http://www.w3.org/MarkUp/2004/xhtml-faq#ie):如果通過使用 XSLT 轉換將 XHTML 文檔轉換為 HTML,那麼文檔將分析為 XML 並顯示為 HTML。

例如,清單 1 中的 ASP.NET 頁將以 XML 文檔的形式提供,但被轉換為 HTML 文檔。結果頁會正確地顯示在 Internet Explorer、Opera 和 Firefox 中。

清單 1. XMLPage.aspx

程式碼<%@ Page Language="VB" ContentType="text/xml" %>
<?xml-stylesheet type="text/xsl" href="copy.xsl"?>
<!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" >
<head runat="server">
    <title>My Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    <asp:TextBox ID="txtFirstName" runat="server" />
    </div>
    </form>
</body>
</html>

頁指令會導致該頁以 text/xml 類型呈現。清單中的第二行引用了一個名為 copy.xsl 的 XSLT 樣式表,它會對當前文檔執行標識轉換。換句話說,除了將原始XML 文檔中的所有元素複製到新的 HTML 文檔中以外,它根本沒有做任何事情。copy.xsl 的原始碼包含在清單 2 中。

清單 2. Copy.xsl

程式碼<stylesheet version="1.0"
     xmlns="http://www.w3.org/1999/XSL/Transform">
  <template match="/">
    <copy-of select="."/>
  </template>
</stylesheet>

該解決方案是有效,但它似乎不是很精彩。當分析 XML 文檔時,的確獲得了額外的驗證步驟。但是,如果在 Visual Studio .NET 2005 或 Visual Web Developer 中產生 ASP.NET 頁,那麼開發環境會在“Source”視圖中執行相同的驗證。最後,Internet Explorer 將收到與向它發送 text/html 類型文檔時相同的文檔。

第三個選擇 — 內容協商,將 W3C 推薦標準的精神與最大程度的瀏覽器安全色性最佳地組合在一起(請參閱 http://www.w3.org/2003/01/xhtml-mimetype/content-negotiation)。當使用內容協商時,會以不同的 MIME 類型向不同的瀏覽器提供 ASP.NET 頁。如果瀏覽器聲稱它支援 XHTML,則向它提供 XHTML 類型的頁;否則,以 text/html MIME 類型向該瀏覽器提供頁。

清單 3 中的 Global.asax 包含向不同的瀏覽器提供不同 MIME 類型頁所需的代碼。如果將該檔案添加到 Web 項目中,則每個 ASP.NET 頁的 MIME 類型都會隨著每個請求而修改。將頁提供給 Firefox 或 Opera 時,該頁以 application/xhtml+xml 類型提供。另一方面,Internet Explorer 6 會收到 text/html 頁。

清單 3. Global.asax

程式碼<script runat="server">
    Sub Application_PreSendRequestHeaders(ByVal s As Object, _
      ByVal e As EventArgs)
        If Array.IndexOf(Request.AcceptTypes, _
          "application/xhtml+xml") > -1 Then
            Response.ContentType = "application/xhtml+xml"
        End If
    End Sub
</script>

轉自:http://www.flywe.net/article.asp?id=133

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.