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