从IhttpModule中注入js
我试图通过使用ihttpmodule将js注入页面(到标签)。 但是没有注入js。
我做了什么:
这页纸:
Temp
ihttpmodule:
public class MyExtensionModule : IHttpModule { #region IHttpModule Members public void Dispose() { } public void Init(HttpApplication context) { context.BeginRequest += new EventHandler(context_BeginRequest); } void context_BeginRequest(object sender, EventArgs e) { HttpContext context = ((HttpApplication)sender).Context; Page page = HttpContext.Current.CurrentHandler as Page; if (page != null) { string script = "/Scripts/jquery-1.5.1.js"; if (page.Header != null) { string scriptTag = String.Format("\n", script); page.Header.Controls.Add(new LiteralControl(scriptTag)); } else if (!page.ClientScript.IsClientScriptIncludeRegistered(page.GetType(), script)) page.ClientScript.RegisterClientScriptInclude(page.GetType(), script, script); } } #endregion }
BeginRequest事件太早,无法挂钩到页面。 在请求周期的那一点上,IIS / ASP.NET甚至没有决定将您的请求映射到任何东西。 所以你应该尝试类似PostMapRequestHandler事件。
然而,并非所有内容都存在:此时页面(如果有的话)尚未执行。 这恰好发生在PreRequestHandlerExecute和PostRequestHandlerExecute事件之间。 所以Pre …太早了,Post …太晚了。 最好的办法是挂钩一个页面事件,比如PreRenderComplete ,然后执行你的注射。
public void Init(HttpApplication context) { context.PostMapRequestHandler += OnPostMapRequestHandler; } void OnPostMapRequestHandler(object sender, EventArgs e) { HttpContext context = ((HttpApplication)sender).Context; Page page = HttpContext.Current.CurrentHandler as Page; if (page != null) { page.PreRenderComplete += OnPreRenderComplete; } } void OnPreRenderComplete(object sender, EventArgs e) { Page page = (Page) sender; // script injection here }
注意:很少有人仍然使用它们,但Server.Execute和Server.Transfer 不执行任何管道事件 。 因此,永远不能使用IHttpModule捕获此类子请求。