|
將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(); }![]() }![]() ![]() |
|
|