2010-03-02 71 views
4

我使用代碼波紋管動態包括CSS文件:ASP.NET - 如何僅包含不包含CSS的CSS?

HtmlHead head = (HtmlHead)Page.Header; 
HtmlLink link = new HtmlLink(); 
link.Attributes.Add("href", Page.ResolveClientUrl("~/App_Themes/Default/StyleSheet.css")); 
link.Attributes.Add("type", "text/css"); 
link.Attributes.Add("rel", "stylesheet"); 
head.Controls.Add(link); 

的問題是:我想這樣做只有一次,且僅當它不alrealy包含在頁面中。

如何驗證它是否已包含在內?

編輯:

答案告訴我使用!IsPostBack不會解決我的問題在頁面加載到包括,因爲這樣的代碼將是一個Web用戶控件內,我的頁面可能有很多相同的用戶控制。

例如,我用下面的代碼用JavaScript來做到這一點:

if (!Page.ClientScript.IsClientScriptIncludeRegistered("jsScript")) 
{ 
    Page.ClientScript.RegisterClientScriptInclude("jsScript", ResolveUrl("~/Utilities/myScript.js")); 
} 
+0

如果你的CSS結構合理,這可能是一個不成熟的優化。我無法想象你使用這麼多的CSS,它會顯着減慢瀏覽器。 – 2010-03-02 20:48:46

+1

@Robert Harvey:我認識的人可能不會放慢我的應用程序,我只是不喜歡把垃圾代碼放到我的頁面上,今天我只用了5KB的CSS,但明天當我加上50KB,所以這將是一個問題... – Tufo 2010-03-02 20:57:23

+0

@Jason:所以我需要更可能發佈更簡單的問題?如果你看看我的問題,你會發現它們都很複雜,沒有人回答解決問題的方法。 – Tufo 2010-03-02 20:58:35

回答

4

誰幹的,

我使用的代碼如下:

 Boolean cssAlrealyIncluded = false; 
     HtmlLink linkAtual; 
     foreach (Control ctrl in Page.Header.Controls) 
     { 
      if (ctrl.GetType() == typeof(HtmlLink)) 
      { 
       linkAtual = (HtmlLink)ctrl; 

       if (linkAtual.Attributes["href"].Contains("datePicker.css")) 
       { 
        cssAlrealyIncluded = true; 
       } 
      } 
     } 

     if (!cssAlrealyIncluded) 
     { 
      HtmlLink link = new HtmlLink(); 
      link.Attributes.Add("href", ResolveUrl("~/Utilities/datePickerRsx/datePicker.css")); 
      link.Attributes.Add("type", "text/css"); 
      link.Attributes.Add("rel", "stylesheet"); 
      Page.Header.Controls.Add(link); 
     } 
0

在大多數情況下,如果CSS被包含不止一次你不應該關心。這通常不是問題。

編輯:只有當您需要能夠重寫 css樣式在後續樣式表中訂單才重要。

在ASP.NET中,您可以將CSS包含在您的母版頁中(假設您有一個),然後將保證只包含一次。由於主頁以編程方式提供(即使來自用戶控件),您甚至可以編寫一些屬性(或方法),以允許您控制何時包含哪些CSS外部。

+1

我會基於*大多數情況*不同意*在任何情況下*您希望覆蓋一些CSS行爲,說任何具有主題的網站,訂單很重要,這將是一個問題。 – 2010-03-02 20:53:17

+0

@lBushkin:如果我使用母版頁作爲我的用戶控件,只會讓我擁有母版頁的多個副本,因爲每個用戶控件都會在運行時生成它自己的母版頁編譯代碼,而且我將面臨同樣的問題這個問題... – Tufo 2010-03-02 21:01:36

+0

@Tufo:你爲你的頁面定義了一個母版頁,而不是你的用戶控件。母版頁可以相互繼承,但最終,每個UC沒有多個母版頁實例。 – LBushkin 2010-03-02 21:10:14

3

爲什麼不在你的用戶控件,將值添加到HttpContext.Current.Items表明樣式早已已包括在內?這將防止您需要查看每個用戶控件實例的每個標題控件。

+0

這對我來說最合適。另見http://stackoverflow.com/questions/3876601/asp-net-custom-control-what-is-the-best-way-to-include-embedded-css-reference-o/6623069#6623069 – Colin 2011-07-08 10:19:30