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();
}
}
转载于:https://www.cnblogs.com/jonycaimarcia/archive/2011/03/07/1973362.html