国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > 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>");
                }
            }
        }

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 田阳县| 进贤县| 常宁市| 温泉县| 崇明县| 彰化县| 宁阳县| 监利县| 上思县| 吴旗县| 方正县| 阜阳市| 从江县| 开阳县| 林周县| 陆川县| 阿城市| 海安县| 洛隆县| 漳浦县| 武功县| 黑河市| 甘谷县| 敖汉旗| 双牌县| 车险| 汉沽区| 涞水县| 页游| 四子王旗| 张北县| 道孚县| 高安市| 山阴县| 彰化县| 海盐县| 电白县| 甘肃省| 华池县| 金阳县| 台前县|