动态生成静态页思路:
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
try
259
{
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
finally
270
{
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
}
279
280
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
try
294
{
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
finally
309
{
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
try
323
{
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());
329
330
}
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
}
348
349
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
#region
379
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());
}
}
}
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
} 279

280
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());329

330
}331
catch(System.Exception ex)332
{333
WriteErrFile(ex);334
}335
return "";336
}337
#endregion338

339

340
#region 构造 341
342
public AspxToHtml()343
{344
//345
// TODO: 在此处添加构造函数逻辑346
// 347
}348

349
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
#endregion377

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
#endregion398
}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());
}
}
}

浙公网安备 33010602011771号