2009-11-28 2 views
1

Sur le codebehind, je voudrais énumérer tous les balises <link> sur Page_Load(). Le but étant je veux ajouter un <link> à un fichier CSS s'il n'est pas spécifié dans le balisage Page.ASP.NET: Énumérer les éléments d'en-tête à partir de codebehind

Comment est-ce que je peux faire ceci?

Je pense que je devrais pouvoir utiliser LINQ sur la collection d'éléments dans l'en-tête, non?

Voici mon pseudocode:

var pageAlreadyContainsCssLink = false; 

foreach(var control in this.Header.Controls) { 
    if (control.TagName == "link" && 
     control.Attributes["href"] == "my_css_file.css") { 
     pageAlreadyContainsCssLink = true; 
     break; 
    } 
} 

if (pageAlreadyContainsCssLink) { 
    // Don't add <link> element 
    return; 
} 

// Add the <link> to the CSS 

this.AddCssLink(...); 
+0

Votre code pseudo est très bien. – jfar

Répondre

0

Oui, votre code devrait fonctionner. Cependant, cette situation devrait être gérée à la racine, en l'empêchant de se produire, de sorte que vous n'aurez pas besoin de coder quelque chose 'juste au cas où' pour y faire face.

Votre boucle vérifiée pour l'occurrence du lien css, et si elle existe, quittez. Que faire s'il y a deux ou plusieurs occurrences? Voulez-vous supprimer le (s) duplicata (s)?

Je suggère d'utiliser une ou plusieurs des points suivants:

  1. Masterpage (lieu unique pour vous de gérer les fichiers CSS)
  2. Thème (Tous les fichiers CSS sont liés automatiquement une fois par requête de page)
  3. code standandisation
  4. contrôle personnalisé unique dans l'en-tête pour toutes les pages (besoin de faire l'article que 3 est en place)

1 et 2 ne s'applique pas à ASP.NET 1.x, 3 et 4 s'applique à tous.

1

La solution est d'énumérer la collection Controls comme contrôle HtmlGeneric:

foreach(HtmlControl control in this.Header.Controls) 
    { 
     if (control is HtmlLink && control.Attributes["href"] == this.CssFileLinkHref) 
     { 
      pageAlreadyContainsCssLink = true; 
      break; 
     } 
    }