根据html页面模板动态生成html页面(c#类)

本文转载自:http://www.cnblogs.com/yuanbao/archive/2008/01/06/1027985.html点击打开链接

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

 

posted @ 2014-08-23 15:31  lanqiu5ge  阅读(1036)  评论(0编辑  收藏  举报