最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2014年01月21日 11:42:33   作者:  
這篇文章主要介紹了運(yùn)用了簡(jiǎn)單工廠模式實(shí)現(xiàn)頁(yè)面靜態(tài)化封裝類(lèi),思路比較簡(jiǎn)單,大家可根據(jù)自己的思路再擴(kuò)展此類(lèi)

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

復(fù)制代碼 代碼如下:

public abstract class StaticBase : IDisposable
    {
        /// <summary>
        /// 默認(rèn)編碼方式
        /// </summary>
        protected Encoding code = Encoding.GetEncoding("utf-8");
        /// <summary>
        /// 寫(xiě)入頁(yè)面數(shù)據(jù)流
        /// </summary>
        protected StreamWriter sw = null;
        /// <summary>
        /// 讀取頁(yè)面數(shù)據(jù)流
        /// </summary>
        protected StreamReader sr = null;
        /// <summary>
        /// 生成的靜態(tài)頁(yè)面保存文件夾路徑
        /// </summary>
        protected string SavePath = "/Default/";
        /// <summary>
        /// 模板頁(yè)面的文件夾路徑
        /// </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>
        /// 不同模塊的文件名稱(chēng)
        /// </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 對(duì)應(yīng)的頁(yè)面名稱(chēng)
    /// <summary>
    /// 對(duì)應(yīng)的頁(yè)面名稱(chēng)
    /// </summary>
    public enum FlagsFileName : byte
    {
        /// <summary>
        /// 新聞
        /// </summary>
        [Description("新聞")]
        News = 0,
        /// <summary>
        /// 頭部
        /// </summary>
        [Description("頭部")]
        head=1,
        /// <summary>
        /// 腳部
        /// </summary>
        [Description("腳部")]
        foot=2,
    }

最后的一個(gè)枚舉用于定義不同位置或不同類(lèi)別的靜態(tài)頁(yè)所對(duì)應(yīng)的子類(lèi),接下來(lái)看看其中一個(gè)子類(lèi)的實(shí)現(xiàn)(該子類(lèi)是用于所有單頁(yè),如數(shù)據(jù)庫(kù)中有100條新聞?dòng)涗洠窍鄳?yīng)的生成100個(gè)新聞html頁(yè)面,格式用模板定義的格式確定)
首先模板文件時(shí)靜態(tài)的html頁(yè)面,其中所有的需要從數(shù)據(jù)庫(kù)中替換的字段用一對(duì)$包含,如數(shù)據(jù)庫(kù)中的新聞標(biāo)題字段為titles,則模板頁(yè)中相應(yīng)的標(biāo)題位置用$titles$表示,頁(yè)面如下

復(fù)制代碼 代碼如下:

<!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">&nbsp;</td>
  </tr>
    <tr>
      <td class="ri_mid" id="mid_box">&nbsp;</td>
    </tr>
    <tr>
      <td height="44" class="ri_bottom">&nbsp;</td>
    </tr>
</table>
  </div>
  <!--wp end-->
</div>
<!--wrap end-->

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

到這里知道個(gè)大概了吧,接下來(lái)就是這中頁(yè)面類(lèi)型的子類(lèi)實(shí)現(xiàn),我將它的名稱(chēng)定義為ViewPage,因?yàn)樗锌梢詥为?dú)顯示的頁(yè)面都可以用這個(gè)子類(lèi),代碼如下

復(fù)制代碼 代碼如下:

public class ViewPage : StaticBase
    {
        /// <summary>
        /// 是否操作成功
        /// </summary>
        private bool o_sucess = true;
        /// <summary>
        /// 錯(cuò)誤信息
        /// </summary>
        private string errorstring = string.Empty;
        /// <summary>
        /// 模板文件名稱(chēng)
        /// </summary>
        private string masterhtml;
        /// <summary>
        /// 數(shù)據(jù)源
        /// </summary>
        private IEnumerable<DataRow> rowlist;
        /// <summary>
        /// 模塊類(lèi)別
        /// </summary>
        private FlagsFileName fname;
        /// <summary>
        /// 指定命名文件的標(biāo)志列(從數(shù)據(jù)庫(kù)中的字段)
        /// </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>
        /// 構(gòu)造器靜態(tài)生成對(duì)象
        /// </summary>
        /// <param name="rlist">需要生成靜態(tài)文件的數(shù)據(jù)源</param>
        /// <param name="fn">文件類(lèi)別枚舉</param>
        /// <param name="myid">此字段為數(shù)據(jù)庫(kù)表中字段,由該字段指定生成的文件名字標(biāo)志 </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)//異常則指定返回的錯(cuò)誤信息
            {
                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);
            //要保存的文件名稱(chēng)
            string htmlfilename = string.Empty;
            string changestring = "";//要更改的字符串
            foreach (DataRow row in this.rowlist)//遍歷數(shù)據(jù)源數(shù)組中的每個(gè)數(shù)據(jù)表
            {
                string newString = str;
                try
                {
                    htmlfilename = FileName[fname] + "_" + row[thekey].ToString() + ".html";//給文件命名
                    foreach (DataColumn c in row.Table.Columns)//遍歷單個(gè)數(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;
        }
    }

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

復(fù)制代碼 代碼如下:

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>");
                }
            }
        }

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

相關(guān)文章

  • C#、ASP.NET通用工具類(lèi)IsWhat?(可以判斷數(shù)字、身份證、數(shù)據(jù)類(lèi)型等等)

    C#、ASP.NET通用工具類(lèi)IsWhat?(可以判斷數(shù)字、身份證、數(shù)據(jù)類(lèi)型等等)

    這篇文章主要介紹了C#、ASP.NET通用工具類(lèi)IsWhat?(可以判斷數(shù)字、身份證、數(shù)據(jù)類(lèi)型等等),本文收集整理了多個(gè)擴(kuò)展函數(shù),簡(jiǎn)單實(shí)用,項(xiàng)目必備,如值范圍、在里面嗎、是null或""?、是零?等等,需要的朋友可以參考下
    2015-06-06
  • C#使用MSTest進(jìn)行單元測(cè)試的示例代碼

    C#使用MSTest進(jìn)行單元測(cè)試的示例代碼

    MSTest是微軟官方提供的.NET平臺(tái)下的單元測(cè)試框架,這篇文章主要為大家詳細(xì)介紹了C#如何使用MSTest進(jìn)行單元測(cè)試,感興趣的小伙伴可以參考一下
    2023-12-12
  • Unity3d射箭小游戲?qū)崿F(xiàn)示例

    Unity3d射箭小游戲?qū)崿F(xiàn)示例

    這篇文章主要為大家介紹了Unity3d射箭小游戲?qū)崿F(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • C#中各種類(lèi)型集合的特點(diǎn)詳解

    C#中各種類(lèi)型集合的特點(diǎn)詳解

    這篇文章主要介紹了概述C#中各種類(lèi)型集合的特點(diǎn),這些集合通常位于?System.Collections?和?System.Collections.Generic?命名空間中,下面我將概述C#中幾種常用的集合類(lèi)型及其特點(diǎn),需要的朋友可以參考下
    2024-08-08
  • C#實(shí)現(xiàn)前向最大匹、字典樹(shù)(分詞、檢索)的示例代碼

    C#實(shí)現(xiàn)前向最大匹、字典樹(shù)(分詞、檢索)的示例代碼

    這篇文章主要介紹了C#實(shí)現(xiàn)前向最大匹、字典樹(shù)的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • 基于params,ref,out的參數(shù)問(wèn)題詳解

    基于params,ref,out的參數(shù)問(wèn)題詳解

    本篇文章是對(duì)params,ref,out的參數(shù)問(wèn)題進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • C#中利用代理實(shí)現(xiàn)觀察者設(shè)計(jì)模式詳解

    C#中利用代理實(shí)現(xiàn)觀察者設(shè)計(jì)模式詳解

    學(xué)習(xí)模式注重精髓而非模板,本文為了便于說(shuō)明假定了三方并對(duì)三方功能進(jìn)行了劃分,實(shí)際應(yīng)用并不拘泥于此。如果情況合適將數(shù)據(jù)(文檔)類(lèi)設(shè)計(jì)為單件模式也是一種很不錯(cuò)的選擇
    2014-01-01
  • UnityRTS實(shí)現(xiàn)相機(jī)移動(dòng)縮放功能

    UnityRTS實(shí)現(xiàn)相機(jī)移動(dòng)縮放功能

    這篇文章主要為大家詳細(xì)介紹了UnityRTS實(shí)現(xiàn)相機(jī)的移動(dòng)縮放功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • 使用C#解決Excel自動(dòng)適應(yīng)列寬的問(wèn)題

    使用C#解決Excel自動(dòng)適應(yīng)列寬的問(wèn)題

    這篇文章主要介紹了如何使用C#解決Excel自動(dòng)適應(yīng)列寬的問(wèn)題,通過(guò) COM 操作 Excel 自動(dòng)適應(yīng)列寬的方法是 AutoFit 方法,該方法適于自動(dòng)適應(yīng)列寬或行高,文中通過(guò)代碼示例和圖文講解的非常詳細(xì),需要的朋友可以參考下
    2024-06-06
  • C#泛型用法實(shí)例分析

    C#泛型用法實(shí)例分析

    這篇文章主要介紹了C#泛型用法,實(shí)例分析了C#泛型的功能、定義與使用技巧,需要的朋友可以參考下
    2015-06-06

最新評(píng)論

阳信县| 林州市| 云南省| 渑池县| 巴塘县| 昭通市| 陇川县| 时尚| 镶黄旗| 绥滨县| 奉贤区| 交口县| 大港区| 喀喇| 台中县| 临泽县| 桑日县| 田阳县| 平度市| 信丰县| 社会| 达州市| 卫辉市| 霍城县| 中方县| 台安县| 罗甸县| 海门市| 青海省| 张掖市| 徐汇区| 泸定县| 崇文区| 来安县| 凯里市| 禄劝| 武夷山市| 乌鲁木齐市| 翁牛特旗| 龙南县| 临武县|