2008-12-02 19 views
3

嘗試過這樣的事情:的HttpModule - 得到的HTML內容或控件修改

HttpApplication app = s as HttpApplication; //s is sender of the OnBeginRequest event 
System.Web.UI.Page p = (System.Web.UI.Page)app.Context.Handler; 
System.Web.UI.WebControls.Label lbl = new System.Web.UI.WebControls.Label(); 
lbl.Text = "TEST TEST TEST"; 
p.Controls.Add(lbl);  
運行這個時候

我得到「未將對象引用設置到對象的實例。」最後一行...

如何在原始文件的特定操作中插入兩行文本(asp.net/html)? 我怎麼弄出文件的擴展名(我只想申請這個aspx文件...?

+0

它是否爲「p」給出空引用?處理程序不是一個頁面? – 2008-12-02 08:02:34

+0

你還可以發佈異常的堆棧跟蹤嗎?這可能有助於診斷問題。 – csgero 2008-12-02 08:42:51

+1

該代碼不起作用,因爲該頁面對象在請求開始時不可用,請嘗試使用PreRequestHandlerExecute代替 – haze4real 2010-06-04 14:37:28

回答

4

我不知道,但我不認爲你可以使用HttpModule來改變Page的控制樹(如果我錯了,請糾正我)。然而,您可以修改HTML標記,但您必須爲此編寫一個「響應過濾器」。有關示例,請參閱http://aspnetresources.com/articles/HttpFilters.aspx或Google for「httpmodule response filter 」

+0

對於控制樹問題,您可能是完全正確的,這就是我對該主題的無知。我會看看http過濾器的東西 – noesgard 2008-12-02 08:43:56

0

目前已在比IIS6或5你怎麼寫的HttpModules在IIS7一些變化,所以它可能是我的建議,如果你正在使用IIS7是無效的。

如果您當前使用的靜態屬性HttpContext可以獲得對當前上下文的引用。 HttpContext類具有Request(HttpRequest類型)和Response(HttpResponse)兩個屬性,並且取決於您正在處理哪個事件(Application.EndRequest可能?),您可以對這些對象執行各種操作。

如果您想更改正在交付的頁面的內容,您可能希望儘可能晚地做到這一點,因此對EndRequest事件的響應可能是最好的做法。

通過檢查Request.Url屬性(可能與System.IO.Path類一起)來檢查請求的文件類型。試試這樣:

string requestPath = HttpContext.Current.Request.Url.AbsolutePath; 
string extension = System.IO.Path.GetExtension(requestPath); 
bool isAspx = extension.Equals(".aspx"); 

修改內容比較困難。您可能可以在Context對象的其中一個事件中執行此操作,但我不確定。

一種可能的方法是編寫自己的Cusom頁面派生類,它將檢查Context.Items集合中的值。如果找到了這個值,你可以爲一個PlaceHolder對象添加一個標籤,並將該標籤的文本設置爲你想要的。

像這樣的東西應該工作:

下面的代碼添加到一個HTTP模塊派生類:

public void Init(HttpApplication context) 
{ 
    context.BeginRequest += new EventHandler(BeginRequest); 
} 

void BeginRequest(object sender, EventArgs e) 
{ 

    HttpContext context = HttpContext.Current; 
    HttpRequest request = context.Request; 

    string requestPath = HttpContext.Current.Request.Url.AbsolutePath; 
    string extension = System.IO.Path.GetExtension(requestPath); 
    bool isAspx = extension.Equals(".aspx"); 

    if (isAspx) 
    { 
    // Add whatever you need of custom logic for adding the content here 
    context.Items["custom"] = "anything here"; 
    } 

} 

那你下面的類添加到App_Code文件夾:

public class CustomPage : System.Web.UI.Page 
{ 
    public CustomPage() 
    { } 

    protected override void OnPreRender(EventArgs e) 
    { 
    base.OnPreRender(e); 

    if (Context.Items["custom"] == null) 
    { 
     return; 
    } 

    PlaceHolder placeHolder = this.FindControl("pp") as PlaceHolder; 
    if (placeHolder == null) 
    { 
     return; 
    } 

    Label addedContent = new Label(); 
    addedContent.Text = Context.Items["custom"].ToString(); 
    placeHolder .Controls.Add(addedContent); 

    } 

} 

然後你可以像這樣修改你的頁面:

public partial class _Default : CustomPage 

請注意,繼承已從System.Web.UI.Page更改爲CustomPage。

最後,將PlaceHolder對象添加到您希望自定義內容的aspx文件中。

1

這似乎是HttpFilter解決方案是在這裏做的伎倆:O)

如果我用了MOSS/.NET 2.x的+我可以使用符文版或剛添加我的標籤在母版頁.. 。

超級的建議和我的解決方案的測試後,我會接受miies.myopenid.com的解決方案,因爲它似乎解決塔爾實際問題

6

其simplier比你想象:

public void Init(HttpApplication app) 
    { 
     app.PreRequestHandlerExecute += OnPreRequestHandlerExecute; 
    } 

    private void OnPreRequestHandlerExecute(object sender, EventArgs args) 
    { 
     HttpApplication app = sender as HttpApplication; 
     if (app != null) 
     { 
      Page page = app.Context.Handler as Page; 
      if (page != null) 
      { 
       page.PreRender += OnPreRender; 
      } 
     } 
    } 

    private void OnPreRender(object sender, EventArgs args) 
    { 
     Page page = sender as Page; 
     if (page != null) 
     { 
      page.Controls.Clear(); // Or do whatever u want with ur page... 
     } 
    } 

如果PreRender事件不足,您可以在PreRequestHandlerExecute EventHandler中添加需要的任何事件...