將asp.net頁面靜態(tài)化有很大意義,在些我就不多說了,實現(xiàn)asp.net頁面靜態(tài)化有很多種方面,在此我介紹一種在asp.net內(nèi)實現(xiàn)的方法。大家都知道,每個asp.net頁面都有一個特定的類對其進行處理,默認情況下該類是從Page類派生的。我們所要做的就是從Page類派生自己的類改寫特定的方法。具體實現(xiàn)如下:
using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.IO;
public class FreezablePage : System.Web.UI.Page
{
// When Asp.Net renders the page the Page.Render method is invoked
// Override the method to hook in
protected void Page_Load(object sender, EventArgs e)
{
//Response.HeaderEncoding = System.Text.Encoding.UTF8;
//Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312");
Freeze(string.Format(@"{0}.htm", Request.Url.ToString()));
}
protected override void Render(HtmlTextWriter writer)
{
if (freeze)
{
MyHtmlFileCreator htmlFile = new MyHtmlFileCreator();
// Let Asp.net render the output, catch it in the file creator
base.Render(htmlFile.RenderHere);
newUrl = HttpContext.Current.Request.Url.AbsolutePath.ToString();
newUrl = newUrl.Replace(".aspx", ".htm");
//Response.HeaderEncoding = System.Text.Encoding.UTF8;
//Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312");
// Write new html file
htmlFile.WriteHTMLFile(Server.MapPath(newUrl));
// Redirect
Response.Redirect(newUrl, true);
}
else
{
// Default behavior
base.Render(writer);
}
}
// Flag render event
protected void Freeze()
{
freeze = true;
}
protected void Freeze(string toUrl)
{
freeze = true;
NewUrl = toUrl;
}
private bool freeze = false;
private string newUrl;
internal string NewUrl
{
get
{
return newUrl;
}
set
{
newUrl = value;
}
}
}
internal class MyHtmlFileCreator
{
private StringWriter html;
private MyHtmlTextWriter htmlWriter;
// override the HtmlTextWriter to reach the constructor
// the constructor in the base class is protected
class MyHtmlTextWriter : HtmlTextWriter
{
internal MyHtmlTextWriter(TextWriter tw) : base(tw) { }
}
// publish the HTMLwriter
internal HtmlTextWriter RenderHere
{
get { return htmlWriter; }
}
// constructor initializes stringwriter and htmlwriter based on that
// initialize Url
internal MyHtmlFileCreator()
{
html = new StringWriter();
htmlWriter = new MyHtmlTextWriter(html);
}
internal void WriteHTMLFile(string virtualFileName)
{
// Stringreader reads output rendered by asp.net
// Stringwriter writes html output file
StringReader sr = new StringReader(html.ToString());
StringWriter sw = new StringWriter();
// Read from input
string htmlLine = sr.ReadLine();
while (htmlLine != null)
{
/**///// Filter out ASp.net specific tags
//if (!((htmlLine.IndexOf("<form") > 0) ||
// (htmlLine.IndexOf("__VIEWSTATE") > 0) ||
// (htmlLine.IndexOf("</form>") > 0)))
//{ sw.WriteLine(htmlLine); }
sw.WriteLine(htmlLine);
htmlLine = sr.ReadLine();
}
// Write contents stringwriter to html file
StreamWriter fs = new StreamWriter(virtualFileName,false,System.Text.Encoding.UTF8);
//StreamWriter f=new StreamWriter(
fs.Write(sw.ToString());
fs.Close();
}
}
你只要用此類做為你的頁面的基類就可實現(xiàn)頁面的靜態(tài)化了,但此方法有一個缺點,就是他頻繁的讀寫文件,會造成性能的下降,那么有沒有更好的方法呢,答案是有肯定的。