有時候我們需要在將伺服器端生成的html傳送帶客戶端之前對這些html進行操作,比如生成靜態html加之儲存、改變生成的html中的某些內容等等,那麼久可以通過如下的方案解決。
我總結了兩種方式,個人覺得比較好用,一種是重寫Page.Render()方法。一種是通過IHttpmodule來實現。
1)這種方法適合控制某個頁面,在.aspx.cs裡面重寫Render()方法即可,該方法提供一個HtmlTextWriter 型別引數,裡面就包含了將要傳送到客戶端的內容,根據asp.net宣告週期知道Render階段是在load事件之後觸發的,所以,這個方法很適合完成我們想要的效果。下面是一個簡單的例子:
1: protected override void Render(HtmlTextWriter writer)
2: {
3: TextWriter tempWriter = new StringWriter();
4: base.Render(new HtmlTextWriter(tempWriter));
5: string str = tempWriter.ToString(); //這個str裡面已經包含了html。
6:
7: //然後可以對這個字串進行處理,比如儲存、替換等等
8: writer.Write(str); //再將修改好的html傳送到客戶端
9: }
2)這種方法在應用級控制,更適合需要對某一類頁面進行處理,或者所有頁面比較方面。要註冊介面的PreSendRequestContent方法,下面為一個例子,有關IHttpmodule內容,本文不重複了:
1: void context_PreSendRequestContent(object sender, EventArgs e)
2: {
3: HttpApplication app = (HttpApplication)sender;
4: HttpContext context = app.Context;
5: string url = context.Request.RawUrl;
6: StringWriter wr = new StringWriter();
7: context.Server.Execute(url, wr);
8: string htmlCon = wr.ToString();//字串htmlCon 已經包含了將要傳送到客戶端的html。
9:
10: }
3) 通過替換Response.Filter也可以實現。