a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > C# > 正文

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

2020-01-24 02:51:05
字體:
來源:轉載
供稿:網(wǎng)友

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

復制代碼 代碼如下:

public abstract class StaticBase : IDisposable
    {
        /// <summary>
        /// 默認編碼方式
        /// </summary>
        protected Encoding code = Encoding.GetEncoding("utf-8");
        /// <summary>
        /// 寫入頁面數(shù)據(jù)流
        /// </summary>
        protected StreamWriter sw = null;
        /// <summary>
        /// 讀取頁面數(shù)據(jù)流
        /// </summary>
        protected StreamReader sr = null;
        /// <summary>
        /// 生成的靜態(tài)頁面保存文件夾路徑
        /// </summary>
        protected string SavePath = "/Default/";
        /// <summary>
        /// 模板頁面的文件夾路徑
        /// </summary>
        protected string PagePath = "/Master/";
        public abstract bool Osucess { set; get; }
        public abstract string Errorstring { set; get; }
        /// <summary>
        /// 具體生成靜態(tài)方法
        /// </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,
    }

最后的一個枚舉用于定義不同位置或不同類別的靜態(tài)頁所對應的子類,接下來看看其中一個子類的實現(xiàn)(該子類是用于所有單頁,如數(shù)據(jù)庫中有100條新聞記錄,那相應的生成100個新聞html頁面,格式用模板定義的格式確定)
首先模板文件時靜態(tài)的html頁面,其中所有的需要從數(shù)據(jù)庫中替換的字段用一對$包含,如數(shù)據(jù)庫中的新聞標題字段為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>

到這里知道個大概了吧,接下來就是這中頁面類型的子類實現(xiàn),我將它的名稱定義為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>
        /// 數(shù)據(jù)源
        /// </summary>
        private IEnumerable<DataRow> rowlist;
        /// <summary>
        /// 模塊類別
        /// </summary>
        private FlagsFileName fname;
        /// <summary>
        /// 指定命名文件的標志列(從數(shù)據(jù)庫中的字段)
        /// </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>
        /// 構造器靜態(tài)生成對象
        /// </summary>
        /// <param name="rlist">需要生成靜態(tài)文件的數(shù)據(jù)源</param>
        /// <param name="fn">文件類別枚舉</param>
        /// <param name="myid">此字段為數(shù)據(jù)庫表中字段,由該字段指定生成的文件名字標志 </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)//遍歷數(shù)據(jù)源數(shù)組中的每個數(shù)據(jù)表
            {
                string newString = str;
                try
                {
                    htmlfilename = FileName[fname] + "_" + row[thekey].ToString() + ".html";//給文件命名
                    foreach (DataColumn c in row.Table.Columns)//遍歷單個數(shù)據(jù)表的列名
                    {
                        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;
        }
    }

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

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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 嫩草影院懂你的 | 午夜影院18 | 污网址 | 中文字幕一区二区三区四区五区 | 美日韩一区二区 | 91综合网| 九九热精品视频 | 亚洲精品一级 | 日韩精品一区二区在线观看 | 欧美日韩国产一区二区三区 | 精品91在线视频 | 国产精品免费一区二区三区四区 | 国产一区免费在线观看 | 久久国产精品免费一区二区三区 | 日韩精品一区二区三区 | 国产成人一区 | 好看的一级毛片 | 区一区二区三在线观看 | 娇小12—13毛片| 在线免费毛片 | 91免费国产在线 | 四虎影视免费在线观看 | 欧美日韩国产一区二区三区 | 色av综合| 91成人免费看片 | 午夜影视在线观看 | 吴梦梦到粉丝家实战华中在线观看 | 国产乱码精品一区二区三区五月婷 | 性视频网站免费 | 成人午夜视频在线观看 | 亚洲欧美中文日韩在线v日本 | 国产精品久久久久aaaa九色 | 伊人网综合视频 | 久久视频一区二区 | 欧美中文字幕在线 | 91在线精品视频 | www.国产一区| 北条麻妃一区二区三区在线 | 亚洲一区二区精品视频 | 999久久久国产精品 忘忧草精品久久久久久久高清 | 亚洲精品视频在线 |