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