这几日,同学问我怎样将动态页面直接生车静态的html页面,我想了想以前做过这个,今天把方法做个总结。
我所知道的生成静态页面的方法有两种,当然其他方法还有很多,我比较了解的是模板生成和地址映射。
第一种模板生成:模板生成其实就死定义一个静态的html模板,然后将里面的关键字替换掉。例如:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<HEAD>
<title>$ShowArticle</title>
<body>
biaoti
<br>
$content<br>
author
</body>
</HTML>
$biaoti
<br>
$content<br>
$author
</body>
</HTML>
然后用字符替换将关键字替换成动态的内容,输出html文件,这种方法灵活度太差,如果一个站点的网页形式千变万化,增删改查特别频繁,那么这种方法就显得无能为力了。
第二种方法地址映射,这种方法就把以上的缺点全都克服掉了。直接输入地址 生成静态。生成的静态 页面和动态页面一模一样。
代码:
public static string ExecAspxToHtml(string Url, string Path, string FileName)//参数:动态页面的地址,生成静态html的地址,html文件的名字
{
try
{
StringWriter strHTML = new StringWriter();
System.Web.UI.Page myPage = new Page(); //System.Web.UI.Page中有个Server对象,我们要利用一下它
myPage.Server.Execute(Url, strHTML); //将asp_net.aspx将在客户段显示的html内容读到了strHTML中
StreamWriter sw = new StreamWriter(Path+"/" + FileName, false, System.Text.Encoding.GetEncoding("GB2312"));
//新建一个文件Test.htm,文件格式为GB2312
sw.Write(strHTML.ToString()); //将strHTML中的字符写到Test.htm中
strHTML.Close(); //关闭StringWriter
sw.Close(); //关闭StreamWriter
return "生成成功";
}
catch (Exception ex)
{
return ex.ToString();
}
}
调用此方法
if (File.Exists(Server.MapPath("../") + "chanpin.aspx"))
{
tohtml.ExecAspxToHtml("../chanpin.aspx", Server.MapPath("../"), "chanpin.html");
}
就是这样就会自动生成静态页面html,方便吧,但是这种方法再用的时候一定要注意生成静态html后的链接,因为当你生成html后它原来的链接都是.aspx页面而现在都变成了html页面,所以还要在生成静态的时候过滤一下链接:
private string ReplaceStr(Match m)
{
return m.Value + ".html";
}
StreamReader sr = new StreamReader(Server.MapPath("../chanpin.html"), code);
string html = sr.ReadToEnd();
html = html.Replace("cp_read.aspx?cpid=", "cpread/cp_read");
Regex reg = new Regex(@"(?is)(?<=<a\s?href[^>].*?)cpread/cp_read[\d]+");
html = reg.Replace(html, ReplaceStr);
sr.Dispose();
sr.Close();
StreamWriter sw = new StreamWriter(Server.MapPath("../chanpin.html"), false, code);
sw.Write(html);
sw.Flush();
sw.Close();
好就是这样差不多就完成了,可能还会遇到其他问题,想办法自己解决吧。