一直以为动态生成静态页面不好做,昨天在网上找了下,我晕,其实很简单,思路大概是这样的,
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 /**//// 
 9 /// AspxToHtml 的摘要说明。
 10 /// 注:使用此类,你可以在web.config文件对模板类进行配置.如下
 11 /**//*
 12 
 13 
 14  
 15 */
 16 /**//// 
 17 public class AspxToHtml
 18 {
 19 /**//// 
 20 /// 模板文件中要替代的参数个数
 21 /// 
 22 private int _templateParamCount=0;
 23 /**//// 
 24 /// 模板文件所在的路径
 25 /// 
 26 private string _templateFilePath =ConfigurationSettings.AppSettings["templateFilePath"];
 27 /**//// 
 28 /// 转换后的html文件所存放的路径
 29 /// 
 30 private string _htmlFilePath =ConfigurationSettings.AppSettings["htmlFilePath"];
 31 
 32 /**//// 
 33 /// 模板页页面编码
 34 /// 
 35 private Encoding _templateHtmlCode =Encoding.GetEncoding("gb2312");
 36
 37 /**//// 
 38 /// 转换后的文件编码
 39 /// 
 40 private Encoding _code = Encoding.GetEncoding("gb2312");
 41
 42 /**//// 
 43 /// 转换后的html文件名
 44 /// 
 45 private string _convertedFilename="";
 46 /**//// 
 47 /// 模板文件中的参数
 48 /// 
 49 private string[] _templateFileparameter ;
 50 
 51 /**//// 
 52 /// aspx文件中的要代替HTML文件中的参数实际值
 53 /// 
 54 private string[] _aspxFileparameter;
 55
 56 private string _errlogPath = ConfigurationSettings.AppSettings["ErrLogPath"];
 57
 58 属性#region 属性
 59 
 60 /**//// 
 61 /// 模板文件中要替代的参数个数
 62 /// 
 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 /**//// 
 88 /// 模板文件所在的路径
 89 /// 
 90 /// 
 91 public string TemplateFilePath
 92 {
 93 get{ return this._templateFilePath;}
 94 set{ this._templateFilePath=value;}
 95 }
 96 /**//// 
 97 /// 转换后的html文件所存放的路径
 98 /// 
 99 public string HtmlFilePath
100 {
101 get{ return this._htmlFilePath;}
102 set{ this._htmlFilePath=value;}
103 }
104
105 /**//// 
106 /// html模板文件编码
107 /// 
108 public Encoding TemplateHtmlCode
109 {
110 get{ return this._templateHtmlCode;}
111 set{ this._templateHtmlCode=Encoding.GetEncoding(value.ToString());}
112 }
113 /**//// 
114 /// 编码
115 /// 
116 public Encoding Code
117 {
118 get{ return this._code;}
119 set{ this._code=Encoding.GetEncoding(value.ToString());}
120 }
121 /**//// 
122 /// 错误文件所在路径
123 /// 
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 /**//// 
141 /// 获取转换后的html文件所在相对文件路径
142 /// 如:如果HtmlFilePath="/news/"
143 /// 转换后的html文件名为200505050505.html
144 /// 则返回的值为/news/200505050505.html
145 /// 
146 /// 如果在未调用StartConvert方法之前调用此属性则返回null
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 /**//// 
159 /// 为HTML页面参数数组付值
160 /// 
161 /// 
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 /**//// 
177 /// 为aspx文件中将要替换html文件中的参数数组付值
178 /// 
179 /// 
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 /**//// 
195 /// 开始进行aspxTohtml转换
196 /// 
197 /// 返回值为成功创建后的文件名称
198 /// 在调用此方法之前必需确定已调用setTemplateFileparameter 和setAspxFileparameter方法进行相应的付值操作
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 /**//// 
210 /// 开始进行aspxTohtml转换
211 /// 
212 /// html模板页中的所有参数数组
213 /// aspx页面中要代替html模板页中参数值数组
214 /// 返回值为成功创建后的文件名称
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 /**//// 
229 /// 用时间加随机数生成一个文件名
230 /// 
231 /// 
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 /**//// 
248 /// 进行转换处理
249 /// 
250 /// 返回以时间命名的文件名
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;i276 {
277 str =str.Replace(this._templateFileparameter[i],this._aspxFileparameter[i]); 
278 } 
279
280 return savefile(str); 
281 }
282
283 /**//// 
284 /// 
285 /// 
286 /// 
287 /// 
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 /**//// 
316 /// 传入URL返回网页的html代码
317 /// 
318 /// URL
319 /// 
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 /**//// 
355 /// 提供欲代替的参数个数
356 /// 
357 /// 
358 public AspxToHtml(int templateParamCount)
359 { 
360 settemplateParamCount(templateParamCount);
361 
362 }
363 /**//// 
364 /// 
365 /// 
366 /// html模板页中的参数个数
367 /// 生成的html文件所存放的文件夹路径
368 /// html模板页路径
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 /**//// 
381 /// 把错误写入文件方法#region 把错误写入文件方法
382 /// 
383 /// 
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