在 web.config 全域啟用 Theme 後,若想讓特定頁面(如 Web Service、AJAX 端點、XML 輸出頁)完全不套用主題,單靠 EnableTheming="false" 往往失效——它只能停用 .skin 檔,無法阻擋 .css 樣式表注入。本文提供徹底解決方案。
<!-- web.config 全域啟用 Theme -->
<pages theme="DefaultTheme"></pages>
<!-- 頁面指示詞嘗試停用 -->
<%@ Page EnableTheming="false" %>
錯誤訊息:「使用主題的 CSS 檔案要求頁面上有標頭控制項 (如 <head runat="server" />)」
原因:XMLHTTP/ASMX/ASHX 等無 HTML 輸出的端點,被強制注入 CSS 連結導致例外。
在 @Page 指示詞中同時設定:
<%@ Page EnableTheming="false" StyleSheetTheme="" %>
| 屬性 | 作用範圍 | 效果 |
|---|---|---|
EnableTheming="false" | .skin 檔(控制項外觀屬性) | 停用控制項皮膚套用 |
StyleSheetTheme="" | .css 檔(樣式表連結) | 清空樣式表主題,阻止 CSS 注入 |
ASCX 無 @Page 指示詞,無法直接設定 StyleSheetTheme。變通做法:
<head runat="server"></head> 滿足 Theme 引擎檢查this.Response.Clear();
this.Response.ClearHeaders();
this.Response.ClearContent();
this.Response.Write("");
this.Response.End();
ASP.NET 2.0 Theme 機制分兩階段:
OnPreInit 之前,注入 <link> 標籤引用 .cssTheme 階段:在 OnPreInit 之後,套用 .skin 定義的控制項屬性EnableTheming 僅影響第二階段;必須用 StyleSheetTheme="" 空字串覆蓋第一階段,才能徹底切斷 CSS 注入管線。
IHttpHandler 而非使用 .aspx,根源避免 Theme 處理[ScriptService] 或 Web API,不經由頁面生命週期ContentType 設正確 + 雙重屬性停用 Theme