Input js from IhttpModule

I am trying to embed js on a page (in tags) using ihttpmodule. but js is not entered.

What I've done:

page:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="MyTempProject._Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head> <title>Temp</title> </head> <body> <form id="form1"> <div> </div> </form> </body> </html> 

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("<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); } } #endregion } 
+7
source share
1 answer

The BeginRequest event is too early to enter the page. At this point in the request cycle, IIS / ASP.NET did not even decide to match your request with anything. Therefore, you should probably try something like the PostMapRequestHandler event.

However, this is not all he needs: at this moment the page (if there is one) has not yet been completed. This happens right between the PreRequestHandlerExecute and PostRequestHandlerExecute events . So, Pre ... too early, and Post ... too late. It is best to catch a page event, such as PreRenderComplete , and complete your injection.

 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 } 

ATTENTION: Few people still use them, but Server.Execute and Server.Transfer do not execute any pipeline events. Therefore, such child requests can never be caught using the IHttpModule .

+8
source

All Articles