根据html页面模板动态生成html页面(c#类)
思路大概是这样的,
1:建立一个HTML页面模板,在这个页面中把你想要动态显示的地方用特殊的字符串表示(如$HTMLstrstr$);
2:在程序中用将这个HTML页面读到一个字符串变量如str;
3:用字符串的resplace方法将在第一步中特殊字符替换成你想要的内容;
4保存;
OK,so easy,今天就用C#写了一个这样的类,用来处理动态生成HTML页面的,自认为还写的完整,刚接触.NET不久,望指教
注:此类中的代码不全是原创,部份代码参照网友的代码!

以下是转换类的代码


代码
1using System;
2using System.Text;
3using System.Web;
4using System.Configuration;
5using System.IO;
6namespace 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

