2011-03-08 25 views
7

我試圖通過使用ihttpmodule注入js到頁面(到標記)。 但js沒有注入。從IhttpModule注入js

我做了什麼:

頁:

<%@ 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 
    } 
+0

以及它永遠不會被添加到page.Header,因爲它不存在(根據您的代碼)。是否有輸出?你是否瀏覽了代碼?你有沒有例外? – jonezy 2011-03-08 23:37:44

+0

不,沒有任何異常..它從來沒有添加scripttag ..所以我怎麼能添加到頭標籤?有什麼想法? – 2011-03-08 23:40:47

回答

8

的BeginRequest事件是太早掛接到一個頁面。在請求週期的那一點,IIS/ASP.NET甚至沒有決定將你的請求映射到任何東西。因此,您應該嘗試使用類似PostMapRequestHandler事件。

但是,這並不是全部:在那一點上,頁面(如果有的話)還沒有執行。這發生在PreRequestHandlerExecutePostRequestHandlerExecute事件之間。所以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.ExecuteServer.Transfer的不執行任何管道事件。因此,使用IHttpModule永遠無法捕獲此類子請求。

+0

我今天剛學到東西。是否有任何等同於執行管道事件的'Server.Transfer'? – 2011-03-09 01:29:58

+0

不是我所知道的,沒有。 – Ruben 2011-03-09 10:59:25

+1

謝謝!我學到了新的東西:)現在它的工作完美..我可以使用Response.redirect而不是Server.Transfer? – 2011-03-09 18:30:02