2010-01-27 12 views

Répondre

2

Dans ces cas, j'ai généralement ajouter un ContentPlaceHolder dans l'étiquette de ma page principale.

Sinon je l'ai utilisé une méthode (habituellement dans une classe utilitaire ou classe PageBase) qui met la chaîne de script dans une liste et le stocke dans le contexte ASP.Net comme ceci:

  List<string> javaScriptUrls = new List<string>(); 

      url = url.ToLower(); 

      javaScriptUrls = Context.Items[JS_KEY] as List<string>; 

      if (javaScriptUrls == null) 
      { 
       javaScriptUrls = new List<string>(); 

       javaScriptUrls.Add(url); 
      } 
      else 
      { 
       if (!javaScriptUrls.Contains(url)) 
        javaScriptUrls.Add(url); 
      } 

      Context.Items[JS_KEY] = javaScriptUrls; 

Puis OnPreRender de la MasterPage, il lit cette liste à partir du contexte et construit des balises dans l'en-tête.

  List<string> _javaScript = Context.Items[JS_KEY] as List<string>; 

      foreach (string js in _javaScript) 
      { 
       HtmlGenericControl script = new HtmlGenericControl(); 
       script.TagName = "script"; 
       script.Attributes.Add("type", "text/javascript"); 
       if (js.StartsWith("~/")) 
        script.Attributes.Add("src", head.ResolveUrl(js)); 
       else 
        script.Attributes.Add("src", js); 

       head.Controls.Add(script); 

       AddHeaderLineBreak(head); 
      } 
+0

Merci pour la réponse approfondie. Cette solution de contournement signifie que je ne peux pas utiliser "IsClientScriptIncludeRegistered" ... Je suppose que vous pouvez simplement continuer à ajouter les URL à la liste, puis enregistrer uniquement les entrées uniques. –

+0

correct. Notez cette ligne: if (! JavaScriptUrls.Contains (url.ToLower())) javaScriptUrls.Add (url); Cela maintient l'unicité dans la liste – hunter