一直以为动态生成静态页面不好做,昨天在网上找了下,我晕,其实很简单,思路大概是这样的,
1:建立一个html页面模板,在这个页面中把你想要动态显示的地方用特殊的字符串表示(如$htmlstrstr$);
2:在程序中用将这个html页面读到一个字符串变量如str;
3:用字符串的resplace方法将在第一步中特殊字符替换成你想要的内容;
4保存;
OK,so easy,今天就用C#写了一个这样的类,用来处理动态生成html页面的,自认为还写的完整,刚接触.NET不久,望指教,完整代码与示例在此下载:下载
一直以为动态生成静态页面不好做,昨天在网上找了下,我晕,其实很简单,思路大概是这样的,
1:建立一个html页面模板,在这个页面中把你想要动态显示的地方用特殊的字符串表示(如$htmlstrstr$);
2:在程序中用将这个html页面读到一个字符串变量如str;
3:用字符串的resplace方法将在第一步中特殊字符替换成你想要的内容;
4保存;
OK,so easy,今天就用C#写了一个这样的类,用来处理动态生成html页面的,自认为还写的完整,刚接触.NET不久,望指教,完整代码与示例在此下载:下载
转贴请注明出处,谢谢!
注:此类中的代码不全是原创,部份代码参照网友的代码!
以下是转换类的代码

代码
1
using System;
2
using System.Text;
3
using System.Web;
4
using System.Configuration;
5
using System.IO;
6
namespace solucky
7

{
8
/**//// <summary>
9
/// AspxToHtml 的摘要说明。
10
/// 注:使用此类,你可以在web.config文件对模板类进行配置.如下
11
/**//*<appSettings>
12
<add key="templateFilePath" value="htmlmoudel.htm" />
13
<add key="htmlFilePath" value="new/"></add>
14
<add key="ErrLogPath" value="aspxTohtml_log.txt"></add>
15
</appSettings>*/
16
/**//// </summary>
17
public class AspxToHtml
18
{
19
/**//// <summary>
20
/// 模板文件中要替代的参数个数
21
/// </summary>
22
private int _templateParamCount=0;
23
/**//// <summary>
24
/// 模板文件所在的路径
25
/// </summary>
26
private string _templateFilePath =ConfigurationSettings.AppSettings["templateFilePath"];
27
/**//// <summary>
28
/// 转换后的html文件所存放的路径
29
/// </summary>
30
private string _htmlFilePath =ConfigurationSettings.AppSettings["htmlFilePath"];
31
32
/**//// <summary>
33
/// 模板页页面编码
34
/// </summary>
35
private Encoding _templateHtmlCode =Encoding.GetEncoding("gb2312");
36
37
/**//// <summary>
38
/// 转换后的文件编码
39
/// </summary>
40
private Encoding _code = Encoding.GetEncoding("gb2312");
41
42
/**//// <summary>
43
/// 转换后的html文件名
44
/// </summary>
45
private string _convertedFilename="";
46
/**//// <summary>
47
/// 模板文件中的参数
48
/// </summary>
49
private string[] _templateFileparameter ;
50
51
/**//// <summary>
52
/// aspx文件中的要代替HTML文件中的参数实际值
53
/// </summary>
54
private string[] _aspxFileparameter;
55
56
private string _errlogPath = ConfigurationSettings.AppSettings["ErrLogPath"];
57
58
属性#region 属性
59
60
/**//// <summary>
61
/// 模板文件中要替代的参数个数
62
/// </summary>
63
public int TemplateParamCount
64
{
65
get
66
{
67
return this._templateParamCount;
68
}
69
set//分配参数个数时,同时为模板文件中的参数和aspx文件中的要代替HTML文件中的参数实际值这两个分配实际数组
70
{
71
if (value < 0)
72
throw new ArgumentException();
73
74
if(value>0)
75
{
76
this._templateParamCount=value;
77
//模板文件中的参数
78
_templateFileparameter = new string[value];
79
//aspx文件中的要代替HTML文件中的参数实际值
80
_aspxFileparameter = new string[value];
81
}
82
else
83
this._templateParamCount=0;
84
}
85
}
86
87
/**//// <summary>
88
/// 模板文件所在的路径
89
///
90
/// </summary>
91
public string TemplateFilePath
92
{
93
get
{ return this._templateFilePath;}
94
set
{ this._templateFilePath=value;}
95
}
96
/**//// <summary>
97
/// 转换后的html文件所存放的路径
98
/// </summary>
99
public string HtmlFilePath
100
{
101
get
{ return this._htmlFilePath;}
102
set
{ this._htmlFilePath=value;}
103
}
104
105
/**//// <summary>
106
/// html模板文件编码
107
/// </summary>
108
public Encoding TemplateHtmlCode
109
{
110
get
{ return this._templateHtmlCode;}
111
set
{ this._templateHtmlCode=Encoding.GetEncoding(value.ToString());}
112
}
113
/**//// <summary>
114
/// 编码
115
/// </summary>
116
public Encoding Code
117
{
118
get
{ return this._code;}
119
set
{ this._code=Encoding.GetEncoding(value.ToString());}
120
}
121
/**//// <summary>
122
/// 错误文件所在路径
123
/// </summary>
124
public string ErrLogPath
125
{
126
get
{
127
if(!(this._errlogPath==null))
128
return this._errlogPath;
129
else
130
return "aspxTohtml_log.txt";
131
}
132
set
{this._errlogPath=value;}
133
}
134
135
136
#endregion
137
138
操作#region 操作
139
140
/**//// <summary>
141
/// 获取转换后的html文件所在相对文件路径
142
/// 如:如果HtmlFilePath="/news/"
143
/// 转换后的html文件名为200505050505.html
144
/// 则返回的值为/news/200505050505.html
145
/// </summary>
146
/// <remarks>如果在未调用StartConvert方法之前调用此属性则返回null</remarks>
147
public string HtmlFileVirtualPath
148
{
149
get
150
{
151
if(!(this._convertedFilename==""))
152
return this.HtmlFilePath+this._convertedFilename;
153
else
154
return null;
155
}
156
}
157
158
/**//// <summary>
159
/// 为HTML页面参数数组付值
160
/// </summary>
161
/// <param name="param"></param>
162
public void setTemplateFileparameter(string[] param)
163
{
164
try
165
{
166
if(param.Length==this.TemplateParamCount)
167
this._templateFileparameter=param;
168
//else//与原定义的个数不等
169
//
170
}
171
catch(System.Exception ex)
172
{
173
WriteErrFile(ex);
174
}
175
}
176
/**//// <summary>
177
/// 为aspx文件中将要替换html文件中的参数数组付值
178
/// </summary>
179
/// <param name="param"></param>
180
public void setAspxFileparameter(string[] param)
181
{
182
try
183
{
184
if(param.Length==this.TemplateParamCount)
185
this._aspxFileparameter=param;
186
//else//与原定义的个数不等
187
//
188
}
189
catch(System.Exception ex)
190
{
191
WriteErrFile(ex);
192
}
193
}
194
/**//// <summary>
195
/// 开始进行aspxTohtml转换
196
/// </summary>
197
/// <returns>返回值为成功创建后的文件名称</returns>
198
/// <remarks>在调用此方法之前必需确定已调用setTemplateFileparameter 和setAspxFileparameter方法进行相应的付值操作</remarks>
199
public string StartConvert()
200
{
201
if(this._templateFileparameter.Length==this._aspxFileparameter.Length)
202
{
203
return writeFile();
204
}
205
else
{
206
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