將asp.net頁(yè)面靜態(tài)化有很大意義,在些我就不多說(shuō)了,實(shí)現(xiàn)asp.net頁(yè)面靜態(tài)化有很多種方面,在此我介紹一種在asp.net內(nèi)實(shí)現(xiàn)的方法。大家都知道,每個(gè)asp.net頁(yè)面都有一個(gè)特定的類(lèi)對(duì)其進(jìn)行處理,默認(rèn)情況下該類(lèi)是從Page類(lèi)派生的。我們所要做的就是從Page類(lèi)派生自己的類(lèi)改寫(xiě)特定的方法。具體實(shí)現(xiàn)如下:
using System;
你只要用此類(lèi)做為你的頁(yè)面的基類(lèi)就可實(shí)現(xiàn)頁(yè)面的靜態(tài)化了,但此方法有一個(gè)缺點(diǎn),就是他頻繁的讀寫(xiě)文件,會(huì)造成性能的下降,那么有沒(méi)有更好的方法呢,答案是有肯定的。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(); } } |
|
來(lái)自: Colin收藏 > 《dotnet與windows》