2010-05-26 155 views
10

當主題的網頁時,在給定的主題樣式表的鏈接標籤的結束標記前面的權利渲染。有誰知道改變這種方式的方法嗎?有沒有辦法讓這些標籤可以放在開頭標籤之後?ASP.NET主題樣式呈現

我知道它可以通過只選擇所有的鏈接標籤和head開頭標記之後將其與jQuery下來,但有一種方法來設置它的服務器端?

澄清 讓我們說我在我的主題,一個CSS文件(themed.css)。在此css文件,我有一個div標籤的單一樣式定義與測試的ID:

#test {background-color:red; color:white;} 

讓我們也說我有第二個CSS文件(standard.css),是不是在我的主題,但它與測試的ID的div標籤的另一個定義:

#test {background-color:yellow;} 

我有我的頁面使用的主題,和我有一個手寫的鏈接標籤使用standard.css。執行該頁面時,standard.css的鏈接標記位於themed.css之前。當發生這種情況時,我的具有測試ID的div標籤具有紅色背景和白色前景色。如果我想要themed.css應用,然後standard.css覆蓋必要的屬性(帶白色前景的黃色背景),我會想要themed.css和THEN standard.css。我不能那樣做,因爲ASP.NET將主題文件放在關閉頭標籤之前。

我不想知道我的主題的CSS文件是我的頭標記中的第n個鏈接標記,然後手動更改任何索引,只要我可以在我的主題外添加一個新的CSS文件。

謝謝!

回答

6

我的確在反射有點檢查,並發現了一些你可能會感興趣。框架調用一個PageTheme衍生對象的SetStyleSheet方法在標題中注入鏈路控制。這段代碼顯示了相關的邏輯:

int num = 0; 
foreach (string str in this.LinkedStyleSheets) 
{ 
    HtmlLink child = new HtmlLink { Href = str }; 
    child.Attributes["type"] = "text/css"; 
    child.Attributes["rel"] = "stylesheet"; 
    if (this._styleSheetTheme) 
     this.Page.Header.Controls.AddAt(num++, child); 
    else 
     this.Page.Header.Controls.Add(child); 
} 

翻譯? StyleSheetThemes注入在樣式表開頭的標題標籤的,和主題注入在年底樣式表。

這是主題和風格主題之間的差異預期一致;也就是說,當皮膚和控制設置之間存在衝突時,主題總是會獲勝。當然,在使用!important屬性仍然可以覆蓋一個主題風格非主題的.css文件的樣式,但CSS文件的head標籤內的定位戰略上有利於覆蓋能力風格主題。

請注意,您可以有樣式表主題和常規主題。當然,請留意樣式表主題設計爲可覆蓋的東西,以及不應被覆蓋的主題。

最後一個觀察結果是該方法是internal和非虛擬的,因此干涉這兩個選項將需要一些功夫MMA瘋狂的反思技能,並可能不是穩定性或可維護性的最佳利益。

5

只要你head元素具有runat="server"你可以重新集合中Page_PreRender:

protected void Page_PreRender(object sender, EventArgs e) 
    { 
     ControlCollection container = this.Page.Header.Controls; 
     foreach (var control in container.OfType<System.Web.UI.HtmlControls.HtmlLink>().ToArray()) 
     { 
      container.Remove(control); 
      container.AddAt(0, control); 
     } 
    } 
+0

但是,這是與你的頭裏有一個靜態的鏈接標籤數量的概念。我更加好奇的是,如果有一種方法可以覆蓋將鏈接標籤放在第一位的流程,而不是在案例之後重新排列它們。 – 2010-05-27 14:16:35

+0

目前PreRender()事件發生時,在當前主題文件夾中找到的所有CSS文件的鏈接已經在Header.Controls集合中。所以我的代碼將重新排列靜態和動態(由ASP.NET添加)鏈接。 – UserControl 2010-05-27 15:07:10