一直以为动态生成静态页面不好做,昨天在网上找了下,我晕,其实很简单,思路大概是这样的, 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 }
|