动态生成静态页思路:
1:建立一个html页面模板,在这个页面中把你想要动态显示的地方用特殊的字符串表示(如$htmlstrstr$);
2:在程序中用将这个html页面读到一个字符串变量如str;
3:用字符串的resplace方法将在第一步中特殊字符替换成你想要的内容;
4保存;
return
null
;
207
}
208
}
209
/**/
/// <summary>210 /// 开始进行aspxTohtml转换211 /// </summary>212 /// <param name="htmlparam">html模板页中的所有参数数组</param>213 /// <param name="aspxparam">aspx页面中要代替html模板页中参数值数组</param>214 /// <returns>返回值为成功创建后的文件名称</returns>
215
public
string
StartConvert(
string
[] htmlparam,
string
[] aspxparam)
216
{217 //先调用setTemplateFileparameter 和setAspxFileparameter方法,进行付值操作218 setTemplateFileparameter(htmlparam);219 setAspxFileparameter(aspxparam);220 //221 string fn=this.StartConvert();222 //223 _convertedFilename=fn;224 //225 return fn;226 }
227
228
/**/
/// <summary>229 /// 用时间加随机数生成一个文件名230 /// </summary>231 /// <returns></returns>
232
private
string
getfilename()
233
{234 //用时间加随机数生成一个文件名235 System.Threading.Thread.Sleep(50);236 string yearStr = System.DateTime.Now.Year.ToString();237 string monthStr = string.Format("{0:0#}",System.DateTime.Now.Month);238 string dayStr = string.Format("{0:0#}",System.DateTime.Now.Day); 239 string hourStr = string.Format("{0:0#}",System.DateTime.Now.Hour);240 string minuteStr = string.Format("{0:0#}",System.DateTime.Now.Minute);241 string secondStr = string.Format("{0:0#}",System.DateTime.Now.Second);242 string millisecondStr = string.Format("{0:000#}",System.DateTime.Now.Millisecond); 243 System.Random rd = new System.Random();244 return yearStr + monthStr + dayStr + hourStr + minuteStr + secondStr + millisecondStr + string.Format("{0:0000#}",rd.Next(100))+".html";245 //return DateTime.Now.ToString("yyyyMMddHHmmss")+".html";246 }
247
/**/
/// <summary>248 /// 进行转换处理249 /// </summary>250 /// <returns>返回以时间命名的文件名</returns>
251
private
string
writeFile()
252
{253 254 // 读取模板文件255 string temp = HttpContext.Current.Server.MapPath(this.TemplateFilePath);256 StreamReader sr=null; 257 string str=""; 258 try259 {260 sr = new StreamReader(temp, this.TemplateHtmlCode);261 str = sr.ReadToEnd(); // 读取文件262 }263 catch(Exception ex)264 {265 //HttpContext.Current.Response.Write(exp.Message);266 //HttpContext.Current.Response.End(); 267 WriteErrFile(ex);268 }269 finally270 {271 sr.Close();272 } 273 // 替换内容274 // 这时,模板文件已经读入到名称为str的变量中了275 for(int i=0;i<this.TemplateParamCount;i++)276 {277 str =str.Replace(this._templateFileparameter[i],this._aspxFileparameter[i]); 278 } 279280 return savefile(str); 281 }
282
283
/**/
/// <summary>284 /// 285 /// </summary>286 /// <param name="str"></param>287 /// <returns></returns>
288
289
private
string
savefile(
string
str)
290
{291 // 写文件292 StreamWriter sw=null;293 try294 {295 296 string path = HttpContext.Current.Server.MapPath(this.HtmlFilePath);297 //html文件名称 298 string htmlfilename=getfilename();299 sw = new StreamWriter(path + htmlfilename , false, this.Code);300 sw.Write(str);301 sw.Flush();302 return htmlfilename; 303 }304 catch(Exception ex)305 { 306 WriteErrFile(ex);307 }308 finally309 {310 sw.Close();311 }312 return "";313 }
314
315
/**/
/// <summary>316 /// 传入URL返回网页的html代码317 /// </summary>318 /// <param name="Url">URL</param>319 /// <returns></returns>
320
public
string
getUrltoHtml(
string
Url)
321
{ 322 try323 {324 System.Net.WebRequest wReq = System.Net.WebRequest.Create(Url); 325 System.Net.WebResponse wResp =wReq.GetResponse(); 326 System.IO.Stream respStream = wResp.GetResponseStream(); 327 System.IO.StreamReader reader = new System.IO.StreamReader(respStream, System.Text.Encoding.GetEncoding("gb2312"));328 return savefile(reader.ReadToEnd());329330 }331 catch(System.Exception ex)332 {333 WriteErrFile(ex);334 }335 return "";336 }
337
#endregion
338
339
340
构造
#region 构造 341 342 public AspxToHtml()343 {344 //345 // TODO: 在此处添加构造函数逻辑346 // 347 }348349 private void settemplateParamCount(int templateParamCount)350 {351 if (templateParamCount>0)352 this.TemplateParamCount=templateParamCount;353 }354 /**//// <summary>355 /// 提供欲代替的参数个数356 /// </summary>357 /// <param name="templateParamCount"></param>358 public AspxToHtml(int templateParamCount)359 { 360 settemplateParamCount(templateParamCount);361 362 }363 /**//// <summary>364 /// 365 /// </summary>366 /// <param name="templateParamCount">html模板页中的参数个数</param>367 /// <param name="htmlFilePath">生成的html文件所存放的文件夹路径</param>368 /// <param name="templateFilePath">html模板页路径</param>369 public AspxToHtml(int templateParamCount,string htmlFilePath,string templateFilePath)370 {371 settemplateParamCount(templateParamCount);372 this.HtmlFilePath = htmlFilePath;373 this.TemplateFilePath = templateFilePath;374 375 }376 #endregion
377
378
#region379 380 /**//// <summary>381 /// 把错误写入文件方法#region 把错误写入文件方法382 /// </summary>383 /// <param name="ee"></param>384 private void WriteErrFile(Exception ee)385 {386 387 FileStream fs1 = new FileStream(HttpContext.Current.Server.MapPath(ErrLogPath), System.IO.FileMode.Append);388 StreamWriter sw1 = new StreamWriter(fs1);389 sw1.WriteLine("**************************************************");390 sw1.WriteLine("错误日期:" + System.DateTime.Now);391 sw1.WriteLine("错误描述:" + ee.Message);392 sw1.WriteLine("错误名称:" + ee.Source);393 sw1.WriteLine("详细:" + ee.ToString());394 sw1.WriteLine("*************************************************");395 sw1.Close();396 }397 #endregion
398
}
399
}
400
第二分参考资料
实现动态创建HTML文件的功能需要应用StreamReader和StreamWriter类。
在ASP.net中,String对象是不可改变的,每次使用该类中的方法时,都要在内存中创建一个新的字符串对象,这就需要为新对象分配新的空间。在需要对字符串执行重复修改的情况下,就会增加系统开销。如果要修改字符串而不创建新的对象,则可以使用Sysmte.text命名空间下的StringBuilder类,该类可以改变字符串,当在一个循环中将许多字符串连接到一起时,使用StringBuildr类可以提高性能。
实现方法:首先使用StreamReader对象读取指定HTML模板文件内容,并把读取到的内容保存到StringBuilder对象中,然后通过for循环语句依次替换关键字段,最后再通过StreamWriter对象根据替换后新内容创建一个HTML文件。
代码如下:
页面文件:
新闻模板文件(template.html):
<html>
<head>
<title>$htmlkey[0]</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body >
<table $htmlkey[1] height="100%" border="0" width="100%" cellpadding="10" cellspacing="0" bgcolor="#eeeeee" style="border:1px solid #000000">
<tr>
<td width="100%" valign="middle" align="left">
<span style="color: $htmlkey[2];font-size: $htmlkey[3]"><marquee>$htmlkey[4]</marquee></span>
</td>
</tr>
</table>
</body>
</html>
页面文件:Dhtml.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Dhtml.aspx.cs" Inherits="Dhtml" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "
http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="
http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="Form1" method="post" runat="server">
<asp:Button id="btnCreate" style="Z-INDEX: 101; LEFT: 576px; POSITION: absolute; TOP: 48px"
runat="server" Text="创建HTML文件" OnClick="btnCreate_Click"></asp:Button>
<asp:TextBox id="txtContent" style="Z-INDEX: 102; LEFT: 208px; POSITION: absolute; TOP: 80px"
runat="server" TextMode="MultiLine" Height="402px" Width="352px"></asp:TextBox>
<asp:HyperLink id="hyCreateFile" style="Z-INDEX: 103; LEFT: 584px; POSITION: absolute; TOP: 96px"
runat="server" Target="_blank">创建的HTML文件</asp:HyperLink>
<asp:TextBox id="txtTitle" style="Z-INDEX: 104; LEFT: 208px; POSITION: absolute; TOP: 48px" runat="server"
Width="352px"></asp:TextBox>
<asp:Label id="Label1" style="Z-INDEX: 105; LEFT: 128px; POSITION: absolute; TOP: 48px" runat="server">页面标题</asp:Label>
<asp:Label id="Label2" style="Z-INDEX: 106; LEFT: 128px; POSITION: absolute; TOP: 80px" runat="server">页面内容</asp:Label>
</form>
</body>
</html>
实现代码:Dhtml.aspx.cs
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Text;
using System.IO;
public partial class Dhtml : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void btnCreate_Click(object sender, EventArgs e)
{
string[] newContent = new string[5];//定义和html标记数目一致的数组
StringBuilder strhtml = new StringBuilder();
try
{
//创建StreamReader对象
using (StreamReader sr = new StreamReader(Server.MapPath("TextBox") + "//template.html"))
{
string oneline;
//读取指定的HTML文件模板
while ((oneline = sr.ReadLine()) != null)
{
strhtml.Append(oneline);
}
sr.Close();
}
}
catch (Exception err)
{
//输出异常信息
Response.Write(err.ToString());
}
//为标记数组赋值
newContent[0] = txtTitle.Text;//标题
newContent[1] = "BackColor='#cccfff'";//背景色
newContent[2] = "#ff0000";//字体颜色
newContent[3] = "100px";//字体大小
newContent[4] = txtContent.Text;//主要内容
//根据上面新的内容生成html文件
try
{
//指定要生成的HTML文件
string fname = Server.MapPath("TextBox") + "//" + DateTime.Now.ToString("yyyymmddhhmmss") + ".html";
//替换html模版文件里的标记为新的内容
for (int i = 0; i < 5; i++)
{
strhtml.Replace("$htmlkey[" + i + "]", newContent
); } //创建文件信息对象 FileInfo finfo = new FileInfo(fname); //以打开或者写入的形式创建文件流 using (FileStream fs = finfo.OpenWrite()) { //根据上面创建的文件流创建写数据流 StreamWriter sw = new StreamWriter(fs, System.Text.Encoding.GetEncoding("GB2312")); //把新的内容写到创建的HTML页面中 sw.WriteLine(strhtml); sw.Flush(); sw.Close(); } //设置超级链接的属性 hyCreateFile.Text = DateTime.Now.ToString("yyyymmddhhmmss") + ".html"; hyCreateFile.NavigateUrl = "TextBox/" + DateTime.Now.ToString("yyyymmddhhmmss") + ".html"; } catch (Exception err) { Response.Write(err.ToString()); } }}