2010-03-02 4 views
4

J'utilise le code ci-dessous pour inclure dynamiquement un fichier CSS:ASP.NET - Comment inclure CSS seulement s'il n'est pas déjà inclus?

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); 

Le problème est: Je veux le faire qu'une seule fois, et que si elle n'est pas alrealy inclus dans la page.

Comment vérifier si elle est déjà incluse?

Edit:

Réponses me disent d'inclure dans le chargement de la page à l'aide !IsPostBack ne résoudra pas mon problème, car ce code sera à l'intérieur d'un contrôle utilisateur Web et ma page peut avoir beaucoup du même utilisateur contrôle.

Par exemple, j'utiliser le code ci-dessous pour le faire avec javascript:

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

Si votre CSS est raisonnablement bien structuré, il s'agit probablement d'une optimisation prématurée. Je ne peux pas imaginer que vous utilisiez autant de CSS que cela ralentirait considérablement le navigateur. –

+1

@Robert Harvey: Je connais l'homme, probablement il ne ralentira pas mon application, je n'aime pas l'idée de mettre du code indésirable dans ma page, aujourd'hui je mets un CSS avec seulement 5KB, mais demain quand Je l'ai mis avec 50KB, donc ce sera un problème ... – Tufo

+0

@Jason: Donc, je dois être plus susceptible d'afficher des questions plus simples? Si vous regardez mes questions, vous vous rendrez compte qu'elles sont toutes complexes et personne n'a répondu à quelque chose qui a résolu le problème. – Tufo

Répondre

4

fait ...

le code j'est la suivante:

 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

Dans la plupart des cas, vous ne devriez pas prendre soin si CSS sera inclus plus d'une fois. Ce n'est généralement pas un problème.

EDIT: L'ordre n'a d'importance que si vous devez pouvoir surcharger les styles css dans les feuilles de style suivantes.

Dans ASP.NET, vous pouvez inclure le CSS dans votre page maître (en supposant que vous en ayez un) et il ne sera garanti qu'une seule fois. Comme les pages maîtres sont disponibles par programmation (même à partir des contrôles utilisateur), vous pouvez même écrire des propriétés (ou des méthodes) qui vous permettent de contrôler les éléments externes CSS à inclure quand.

+1

Je ne suis pas d'accord sur la base de * la plupart des cas *, dans tous les cas * où vous voulez remplacer un comportement CSS, dire n'importe quel site avec un thème, l'ordre compte et ce serait un problème. –

+0

@lBushkin: Si j'utilise des pages maîtres pour mes contrôles utilisateur, je n'aurai que plusieurs copies de la page maître, car chaque contrôle utilisateur générera son propre code compilé au moment de l'exécution, et je ferai face au même problème que dans cette question ... – Tufo

+0

@Tufo: Vous définissez une page maître pour vos pages, pas vos contrôles utilisateur.Les pages maîtres peuvent hériter les unes des autres, mais en fin de compte, il n'y a pas plusieurs instances de la page maître par UC. – LBushkin

3

Pourquoi pas dans votre contrôle utilisateur, ajoutez une valeur à HttpContext.Current.Items indiquant que la feuille de style a déjà été inclus? Cela vous évitera de devoir examiner chaque contrôle d'en-tête pour chaque instance du contrôle utilisateur.

+0

Cela a fonctionné le mieux pour moi. Voir aussi http://stackoverflow.com/questions/3876601/asp-net-custom-control-what-is-the-best-way-to-include-embedded-css-reference-o/6623069#6623069 – Colin

Questions connexes