2009-04-27 7 views
1

Je veux que HttpModule injecte des javascripts, des liens CSS dans l'élément HEAD à partir de données de configuration simples. Je ne suis pas sûr de quel événement je devrais accrocher?How2: quel événement à hooker dans HttpModule pour mettre des liens js dans l'élément principal

Curently J'utilise
- context.PreRequestHandlerExecute pour changer la dynamique masterpage
- Context.BeginRequest pour le référencement optimalisation

Il y a un peu d'aide à HTTPModule Event Execution Order?

Merci pour toute astuce. Cheers, X.

Répondre

1

Voilà comment je mis en œuvre ce que vous faites sans HttpModule. Je n'ai pas aimé l'idée de httpmodule parce que si j'avais oublié de l'enregistrer et qu'elle ne fonctionnait pas, mon application ne fonctionnerait pas et cela aurait été un bogue non évident. La page a absolument besoin du JS inclus donc j'ai décidé de le mettre dans la classe Page de base du projet.

I mis en œuvre il y a des années, et je voulais être en mesure d'inclure plus que des scripts, il prend en charge css, les balises meta, etc .... J'oublie pourquoi je Page.Header.Controls.Add au lieu de simplement Page.ClientScript.RegisterClientScriptInclude mais il y avait une raison.

using System; 
using System.Collections.Generic; 
using System.Web; 
using System.Web.UI; 

namespace YourNamespace 
{ 
    public class HeaderIncludesManager 
    { 
     private List<string> m_IncludedFiles = new List<string>(); 

     public void IncludeScript(string s) 
     { 
      IncludeScript(s, null); 
     } 

     public bool IsIncluded(string file) 
     { 
      return (m_IncludedFiles.Find(s => s.Equals(file, StringComparison.InvariantCultureIgnoreCase)) != null); 
     } 

     public void IncludeScript(string script, string condition) 
     { 
      Page page = HttpContext.Current.CurrentHandler as Page; 
      if (!IsIncluded(script) || page == null) 
       return; 

      string scriptFile = string.Format("/{0}/{1}?v={2}", MyConfig.JSDir, script, MyConfig.BuildNumber); 
      if (page.Header != null) 
      { 
       string scriptTag = String.Format("<script language=\"javascript\" type=\"text/javascript\" src=\"{0}\"></script>\n", scriptFile); 
       if (!String.IsNullOrEmpty(condition)) 
        scriptTag = String.Format("<!--[{0}]><script language=\"javascript\" type=\"text/javascript\" src=\"{1}\"></script><![endif]-->\n", condition, scriptFile); 

       page.Header.Controls.Add(new LiteralControl(scriptTag)); 
       m_IncludedFiles.Add(script); 
      } 
      else if (!page.ClientScript.IsClientScriptIncludeRegistered(GetType(), scriptFile)) 
      { 
       page.ClientScript.RegisterClientScriptInclude(GetType(), scriptFile, scriptFile); 
       m_IncludedFiles.Add(script); 
      } 
     } 

     public void IncludeCss(string css) 
     { 
      Page page = HttpContext.Current.CurrentHandler as Page; 
      if (!IsIncluded(css) || page == null) 
       return; 

      string cssfile = string.Format("/{0}/{1}?v={2}", MyConfig.CssDir, css, MyConfig.BuildNumber); 
      if (page.Header != null) 
      { 
       ((Page)HttpContext.Current.CurrentHandler).Header.Controls.Add(new LiteralControl(String.Format("<link href=\"{0}\" rel=\"stylesheet\" type=\"text/css\" />\n", cssfile)));      
       m_IncludedFiles.Add(css); 
      } 
     } 

     public void IncludeJQuery() 
     { 
      IncludeScript("jquery-1.2.3.min.js"); 
     } 

     public void IncludeJQueryUI() 
     { 
      IncludeJQuery(); 
      IncludeScript("jquery.ui.1.0.min.js"); 
      IncludeCss("jquery-theme.css"); 
     } 

     public void IncludeFlotScripts() 
     { 
      IncludeJQuery(); 
      IncludeScript("flot/jquery.flot.js"); 
      IncludeScript("flot/excanvas.pack.js", "if IE"); 
     } 
    } 

    public class MyPage : Page 
    { 
     public HeaderIncludesManager HeaderIncludes = new HeaderIncludesManager(); 
    } 

    public class MyControl : UserControl 
    { 
     public new MyPage Page 
     { 
      get 
      { 
       return (MyPage)base.Page; 
      } 
     } 
    } 

    public class SomeControlThatNeedsScripts : MyControl 
    { 
     protected override void OnLoad(EventArgs e) 
     { 
      Page.HeaderIncludes.IncludeJQueryUI(); 
      base.OnLoad(e); 
     } 
    } 
} 
+0

Ce que j'aime dans cette implémentation, c'est qu'elle charge des scripts, css seulement pour des pages spécifiques. Ce qui peut être mieux dans le cas de scripts, qui ne sont pas utilisés partout. Merci. –

+0

Quelqu'un remarque-t-il le code pour déterminer si l'en-tête existe 'if (page.Header! = Null)'? Je veux savoir dans quel cas le page.header est nul? Hope @Chad pour aider aux commentaires. Merci. –

+1

La question était de savoir comment faire cela avec un httpmodule. – drogon

0

Un HttpHandler serait un meilleur choix pour ce type de fonctionnalité. Voici un exemple qui va plus loin en combinant les fichiers css et javascript; ce n'est pas exactement ce que vous cherchez, mais vous devriez la tête dans la bonne direction: http://www.codeproject.com/KB/aspnet/HttpCombine.aspx

+0

Merci pour le conseil.Il est une mise en œuvre intéressante. –

7
using System; 
using System.Web; 
using System.Web.UI; 

namespace YourNamespace 
{ 
    public class YourModule : IHttpModule 
    { 
     public void Init(HttpApplication context) 
     { 
      context.PreRequestHandlerExecute += Application_PreRequestHandlerExecute; 
     } 

     private void Application_PreRequestHandlerExecute(object sender, EventArgs e) 
     { 
      Page page = HttpContext.Current.CurrentHandler as Page; 
      if (page != null) 
      { 
       string script = "/js/jquery.1.3.2.min.js"; 
       if (page.Header != null) 
       { 
        string scriptTag = String.Format("<script language=\"javascript\" type=\"text/javascript\" src=\"{0}\"></script>\n", script); 
        page.Header.Controls.Add(new LiteralControl(scriptTag)); 
       } 
       else if (!page.ClientScript.IsClientScriptIncludeRegistered(page.GetType(), script)) 
        page.ClientScript.RegisterClientScriptInclude(page.GetType(), script, script); 
      } 
     } 

     public void Dispose() { } 
    } 
} 

ASP.Net Cycle de vie: http://msdn.microsoft.com/en-us/library/ms178473.aspx

+0

Merci par exemple. J'utilise une implémentation similaire. J'étais juste plus circonspect sur l'utilisation du bon événement. Par exemple. dans mon cas j'utilise context.PreRequestHandlerExecute + = ContextPreRequestHandlerExecute; puis page.PreLoad + = PagePreLoad; Dans PagePreLoad, définissez l'élément js et fonctionne très bien. Mais est-ce vrai? –

+0

Oui, c'est l'événement correct. Je n'ai pas fait cela dans un HttpModule, mais je le fais dans ma classe Page de base. Je posterai une autre réponse pour vous montrer comment je l'ai fait. –

+0

@Chad, j'utilise votre code mais le page.Header est toujours nul donc le script est toujours ajouté dans le corps de la page et non dans l'en-tête. La page principale a un donc ça devrait aller. Savez-vous pourquoi? Merci – Riga

Questions connexes