How2: qué evento para enganchar en HttpModule para poner js enlaces en el elemento de cabeza

StackOverflow https://stackoverflow.com/questions/792851

  •  16-09-2019
  •  | 
  •  

Pregunta

Quiero tener HttpModule para inyectar javascript, los enlaces CSS en elemento HEAD de algunos datos de configuración simples. No estoy seguro de qué evento que debería conectar?

Curently utilizo
- context.PreRequestHandlerExecute para cambiar la dinámica masterpage
- Context.BeginRequest para SEO Optimización

Hay un poco de ayuda en HTTPModule Evento orden de ejecución?

Gracias por cualquier punta. Cheers, X.

¿Fue útil?

Solución

Así es como he implementado lo que está haciendo sin HttpModule. No me gustaba la idea HttpModule porque si olvido para registrarlo y no estaba corriendo, mi aplicación no funcionaría, pero habría sido un error no evidente. La página tiene absoluta necesidad de la JS incluido, así que decidí ponerlo en la clase base Página del proyecto.

He implementado esto hace años, y quería ser capaz de incluir algo más que las secuencias de comandos, soporta CSS, meta tags, etc .... me olvido de eso utilicé Page.Header.Controls.Add en lugar de simplemente página. ClientScript.RegisterClientScriptInclude pero había una razón.

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

Otros consejos

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 Ciclo de vida: http://msdn.microsoft.com/en -us / biblioteca / ms178473.aspx

Una HttpHandler sería una mejor opción para este tipo de funcionalidad. Aquí hay un ejemplo que va más de la combinación de archivos CSS y JavaScript; no es exactamente lo que está buscando, pero debe conseguir que va en la dirección correcta: http : //www.codeproject.com/KB/aspnet/HttpCombine.aspx

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top