亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

c#使用簡單工廠模式實現生成html文件的封裝類分享

2020-01-24 02:51:05
字體:
來源:轉載
供稿:網友

由于這段時間比較輕松,于是想到很多的企業網站,新聞網站需要將頁面靜態化,于是寫了個封裝類來實現靜態文件的生成,思路比較簡單,但未完善,網友可根據自己的思路將此類擴展,運用了簡單工廠模式,先來看看靜態類的父類:StaticBase(抽象類)

復制代碼 代碼如下:

public abstract class StaticBase : IDisposable
    {
        /// <summary>
        /// 默認編碼方式
        /// </summary>
        protected Encoding code = Encoding.GetEncoding("utf-8");
        /// <summary>
        /// 寫入頁面數據流
        /// </summary>
        protected StreamWriter sw = null;
        /// <summary>
        /// 讀取頁面數據流
        /// </summary>
        protected StreamReader sr = null;
        /// <summary>
        /// 生成的靜態頁面保存文件夾路徑
        /// </summary>
        protected string SavePath = "/Default/";
        /// <summary>
        /// 模板頁面的文件夾路徑
        /// </summary>
        protected string PagePath = "/Master/";
        public abstract bool Osucess { set; get; }
        public abstract string Errorstring { set; get; }
        /// <summary>
        /// 具體生成靜態方法
        /// </summary>
        protected abstract bool WriteFile();
        /// <summary>
        /// 不同模塊的文件名稱
        /// </summary>
        protected Dictionary<FlagsFileName, string> FileName
        {
            get
            {
                return new Dictionary<FlagsFileName, string>
                {
                    {FlagsFileName.News,"article"},
                    {FlagsFileName.head,"head"},
                    {FlagsFileName.foot,"foot"},
                };
            }
        }
       // http://www.cnblogs.com/roucheng/
        #region IDisposable 成員

        public void Dispose()
        {
            sw.Dispose();
            sr.Dispose();
        }

        #endregion
    }
    #region 對應的頁面名稱
    /// <summary>
    /// 對應的頁面名稱
    /// </summary>
    public enum FlagsFileName : byte
    {
        /// <summary>
        /// 新聞
        /// </summary>
        [Description("新聞")]
        News = 0,
        /// <summary>
        /// 頭部
        /// </summary>
        [Description("頭部")]
        head=1,
        /// <summary>
        /// 腳部
        /// </summary>
        [Description("腳部")]
        foot=2,
    }

最后的一個枚舉用于定義不同位置或不同類別的靜態頁所對應的子類,接下來看看其中一個子類的實現(該子類是用于所有單頁,如數據庫中有100條新聞記錄,那相應的生成100個新聞html頁面,格式用模板定義的格式確定)
首先模板文件時靜態的html頁面,其中所有的需要從數據庫中替換的字段用一對$包含,如數據庫中的新聞標題字段為titles,則模板頁中相應的標題位置用$titles$表示,頁面如下

復制代碼 代碼如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>$Titles$</title>
</script>
</head>
<body>
<div id="wrap">
  $head$
  <!--hd end-->
  <div class="clear"></div>
  <div id="wp">
  <table border="0" cellpadding="0" cellspacing="0" width="980">
    <tr>
      <td rowspan="3" valign="top" id="main_box" class="index_box2">
      <div class="subtitle subtitle4"></div>
      <div class="article">
      <div class="title">$Titles$</div>
         $Contents_tw$
      </div>

      
      </td>
      <td width="48" height="44" class="ri_top"> </td>
  </tr>
    <tr>
      <td class="ri_mid" id="mid_box"> </td>
    </tr>
    <tr>
      <td height="44" class="ri_bottom"> </td>
    </tr>
</table>
  </div>
  <!--wp end-->
</div>
<!--wrap end-->

$foot$
<!--ft end-->
</body>
</html>

到這里知道個大概了吧,接下來就是這中頁面類型的子類實現,我將它的名稱定義為ViewPage,因為所有可以單獨顯示的頁面都可以用這個子類,代碼如下

復制代碼 代碼如下:

public class ViewPage : StaticBase
    {
        /// <summary>
        /// 是否操作成功
        /// </summary>
        private bool o_sucess = true;
        /// <summary>
        /// 錯誤信息
        /// </summary>
        private string errorstring = string.Empty;
        /// <summary>
        /// 模板文件名稱
        /// </summary>
        private string masterhtml;
        /// <summary>
        /// 數據源
        /// </summary>
        private IEnumerable<DataRow> rowlist;
        /// <summary>
        /// 模塊類別
        /// </summary>
        private FlagsFileName fname;
        /// <summary>
        /// 指定命名文件的標志列(從數據庫中的字段)
        /// </summary>
        private string thekey;
        public override bool Osucess
        {
            get { return o_sucess; }
            set { o_sucess = value; }
        }
        public override string Errorstring
        {
            get { return errorstring; }
            set { errorstring = value; }
        }
        /// <summary>
        /// 構造器靜態生成對象
        /// </summary>
        /// <param name="rlist">需要生成靜態文件的數據源</param>
        /// <param name="fn">文件類別枚舉</param>
        /// <param name="myid">此字段為數據庫表中字段,由該字段指定生成的文件名字標志 </param>
        public ViewPage(DataRow[] rlist,FlagsFileName fn,string myid)
        {
            this.thekey = myid;
            this.fname = fn;
            this.rowlist = rlist;
            this.masterhtml = FileName[fn] + ".html";
            WriteFile();
        }

        protected override bool WriteFile()
        {
            string str = "";
            try//從指定模板文件中讀取html代碼
            {
                sr = new StreamReader(HttpContext.Current.Server.MapPath(PagePath + this.masterhtml), code);
                str = sr.ReadToEnd();
            }
            catch (Exception ex)//異常則指定返回的錯誤信息
            {
                sr.Close();
                sr.Dispose();
                this.o_sucess = false;
                this.errorstring = ex.Message;
                return this.o_sucess;
            }
            sr.Close();
            sr.Dispose();
            List<FlagsFileName> fn = new List<FlagsFileName>();
            fn.Add(FlagsFileName.head);
            fn.Add(FlagsFileName.foot);
            PointPage pg = new PointPage(fn, str);
            //要保存的文件名稱
            string htmlfilename = string.Empty;
            string changestring = "";//要更改的字符串
            foreach (DataRow row in this.rowlist)//遍歷數據源數組中的每個數據表
            {
                string newString = str;
                try
                {
                    htmlfilename = FileName[fname] + "_" + row[thekey].ToString() + ".html";//給文件命名
                    foreach (DataColumn c in row.Table.Columns)//遍歷單個數據表的列名
                    {
                        changestring = "$" + c.ColumnName + "$";
                        newString = newString.Replace(changestring, row[c].ToString());
                    }
                    sw = new StreamWriter(HttpContext.Current.Server.MapPath(SavePath + htmlfilename), false, code);
                    sw.Write(newString);
                    sw.Flush();
                }
                catch (Exception ex)
                {
                    this.o_sucess = false;
                    this.errorstring = ex.Message;
                    return this.o_sucess;
                }

            }
            sw.Dispose();
            sw.Close();
            return true;
        }
    }

好,到這里實現了底層的思路設計,那調用就很簡單了,某個aspx頁面,一個按鈕button,一個點擊事件Button_Click,點擊事件內需要做的就是聲明一個基類StaticBase,將它實例化成一個子類ViewPage,傳遞的參數為一個數據項集合,DataRow[]為從數據表中讀取的集合,包含需要替換的字段,如select titles,contens,id from news(從新聞表中獲得標識id,標題,內容),以及類型FlagsFileName.News為前天基類提到過的枚舉類型,為單獨頁面的生成方式,已經重命名的標識列,如此處為id,則生成的頁面格式為
news_1.html,news_2.html以此類推,代碼如下

復制代碼 代碼如下:

protected void Create_Click(object sender, EventArgs e)
        {
            IEnumerable<DataRow> rowlist = TNotice_Command.SelectTNotice(-1);
            using (StaticBase sb = new ViewPage((DataRow[])rowlist, FlagsFileName.News, "NID"))
            {
                if (!sb.Osucess)
                {
                    Response.Write("<script language=javascript>alert('" + sb.Errorstring + "')</script>");
                }
            }
        }

看到這里大家如果再從頭看一遍,相信就能知道靜態文件的生成的原理了。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产视频一区在线| 98视频在线噜噜噜国产| 91大神福利视频在线| 国产视频丨精品|在线观看| 91精品国产99久久久久久| 亚洲va欧美va国产综合久久| 国产精品第二页| 久久九九国产精品怡红院| 国内精品400部情侣激情| 国产91精品最新在线播放| 91精品久久久久久久久不口人| 日韩亚洲成人av在线| 午夜精品福利在线观看| 久久精品国产久精国产一老狼| 日韩欧美在线观看| 亚洲一区二区三区乱码aⅴ蜜桃女| 日韩小视频在线观看| 国产精品日本精品| 欧美xxxx18性欧美| 狠狠色狠狠色综合日日五| 美女av一区二区| 欧美日韩中文字幕日韩欧美| 国产精品对白刺激| 国产精品美女999| 午夜精品久久久久久久男人的天堂| 久久久久久18| 亚洲毛片在线观看| 在线观看日韩欧美| 国产精品都在这里| 久久国产精品久久久| 国产91精品高潮白浆喷水| 日韩av电影中文字幕| 在线观看久久av| 九九精品视频在线观看| 国内久久久精品| 91国内免费在线视频| 中文字幕欧美日韩在线| 亚洲自拍中文字幕| 国产成人精品日本亚洲| 欧美黄色片在线观看| 国产免费一区二区三区在线能观看| 福利二区91精品bt7086| 亚洲欧美国产制服动漫| 久久视频在线观看免费| 国产精品久久久久久久久借妻| 欧美成人一区在线| 欧美成人免费在线视频| 亚洲自拍小视频免费观看| 国产精品一区二区久久国产| 欧美最猛黑人xxxx黑人猛叫黄| 亚洲最大福利视频网站| 4438全国亚洲精品在线观看视频| 久久久国产在线视频| 国产精品精品视频一区二区三区| 成人中文字幕在线观看| 亚洲精品久久久久国产| 亚洲自拍在线观看| 亚洲欧美中文在线视频| 国产日韩视频在线观看| 色伦专区97中文字幕| 91理论片午午论夜理片久久| 91av免费观看91av精品在线| 北条麻妃在线一区二区| 亚洲午夜av电影| 中文字幕av一区中文字幕天堂| 国产精品一区二区久久| 国产91精品不卡视频| 亚洲韩国欧洲国产日产av| 精品日韩美女的视频高清| 久久精品电影网| 久久精品国产电影| 国产一区二区三区欧美| 成人福利在线视频| 国产精品视频内| 国产亚洲精品日韩| 国产精品免费一区豆花| 91久久精品美女高潮| 日韩中文字幕网站| 日韩欧美黄色动漫| 欧美一区深夜视频| 国产欧美精品日韩精品| 国产suv精品一区二区| 国产欧美日韩专区发布| 亚洲色图美腿丝袜| 国产精品久久久久一区二区| 国外成人免费在线播放| 一色桃子一区二区| 欧美激情一区二区三区高清视频| 性色av一区二区咪爱| 欧美猛交ⅹxxx乱大交视频| 国产91网红主播在线观看| 在线日韩精品视频| 在线午夜精品自拍| 69**夜色精品国产69乱| 亚洲韩国青草视频| 97视频在线观看播放| 国产午夜精品理论片a级探花| 久久久亚洲国产| 国模视频一区二区| 亚洲国产一区二区三区在线观看| 精品色蜜蜜精品视频在线观看| 欧美日韩国产在线播放| 欧美性猛交xxxx黑人| 亚洲人成网站999久久久综合| 亚洲第一级黄色片| 日本欧美在线视频| 午夜精品久久久久久久久久久久久| 欧美日韩在线免费观看| 亚洲免费精彩视频| 夜夜嗨av色综合久久久综合网| 91日韩在线视频| 成人自拍性视频| 爽爽爽爽爽爽爽成人免费观看| 97超级碰在线看视频免费在线看| 亚洲国产成人精品久久| 欧美人在线观看| 欧洲美女7788成人免费视频| 最近2019中文免费高清视频观看www99| 日韩美女毛茸茸| 国产精品第一第二| 日本19禁啪啪免费观看www| 日韩中文字幕久久| 国产亚洲欧洲高清| 17婷婷久久www| 亚洲伊人久久综合| 亚洲色图18p| 三级精品视频久久久久| 97久久精品人人澡人人爽缅北| 亚洲午夜精品视频| 中文字幕亚洲一区| 国产精品一区二区三区免费视频| 久久九九全国免费精品观看| 91精品国产色综合久久不卡98口| 在线播放国产一区二区三区| 美女999久久久精品视频| 亚洲成人黄色网| 久久精品视频播放| 亚洲色无码播放| 超碰91人人草人人干| 成人激情av在线| 国产精品影院在线观看| 色香阁99久久精品久久久| 国产精品尤物福利片在线观看| 日韩av在线电影网| 中文字幕日本精品| 永久555www成人免费| 亚洲精品免费网站| 日韩av电影在线播放| 日韩av综合网站| 97超级碰碰人国产在线观看| 欧美精品一区二区三区国产精品| 成人av在线网址| 国产成人精品久久| 日韩av电影在线免费播放| 日韩视频在线一区| 国产精品成人一区| 91精品中国老女人| 成人美女av在线直播| 粉嫩老牛aⅴ一区二区三区| 欧美大片网站在线观看| 成人精品在线观看| 欧美在线视频免费| 日韩电影中文 亚洲精品乱码| 欧美福利视频网站|