當 網頁瀏覽器從 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