1. 程式人生 > >c#生成靜態html檔案,封裝類

c#生成靜態html檔案,封裝類

由於這段時間比較輕鬆,於是想到很多的企業網站,新聞網站需要將頁面靜態化,於是寫了個封裝類來實現靜態檔案的生成,思路比較簡單,但未完善,網友可根據自己的思路將此類擴充套件,運用了簡單工廠模式(本來剛開始看設計模式,是個好書),好了,廢話不多說,先來看看靜態類的父類:StaticBase(抽象類)

 1 public abstract class StaticBase : IDisposable
 2     {
 3         /// <summary>
 4         /// 預設編碼方式
 5         /// </summary>
 6         protected
Encoding code = Encoding.GetEncoding("utf-8"); 7 /// <summary> 8 /// 寫入頁面資料流 9 /// </summary> 10 protected StreamWriter sw = null; 11 /// <summary> 12 /// 讀取頁面資料流 13 /// </summary> 14 protected StreamReader sr = null; 15
/// <summary> 16 /// 生成的靜態頁面儲存資料夾路徑 17 /// </summary> 18 protected string SavePath = "/Default/"; 19 /// <summary> 20 /// 模板頁面的資料夾路徑 21 /// </summary> 22 protected string PagePath = "/Master/"; 23 public abstract bool Osucess { set
; get; } 24 public abstract string Errorstring { set; get; } 25 /// <summary> 26 /// 具體生成靜態方法 27 /// </summary> 28 protected abstract bool WriteFile(); 29 /// <summary> 30 /// 不同模組的檔名稱 31 /// </summary> 32 protected Dictionary<FlagsFileName, string> FileName 33 { 34 get 35 { 36 return new Dictionary<FlagsFileName, string> 37 { 38 {FlagsFileName.News,"article"}, 39 {FlagsFileName.head,"head"}, 40 {FlagsFileName.foot,"foot"}, 41 }; 42 } 43 } 44 // http://www.cnblogs.com/roucheng/ 45 #region IDisposable 成員 46 47 public void Dispose() 48 { 49 sw.Dispose(); 50 sr.Dispose(); 51 } 52 53 #endregion 54 } 55 #region 對應的頁面名稱 56 /// <summary> 57 /// 對應的頁面名稱 58 /// </summary> 59 public enum FlagsFileName : byte 60 { 61 /// <summary> 62 /// 新聞 63 /// </summary> 64 [Description("新聞")] 65 News = 0, 66 /// <summary> 67 /// 頭部 68 /// </summary> 69 [Description("頭部")] 70 head=1, 71 /// <summary> 72 /// 腳部 73 /// </summary> 74 [Description("腳部")] 75 foot=2, 76 }

最後的一個列舉用於定義不同位置或不同類別的靜態頁所對應的子類

,接下來看看其中一個子類的實現(該子類是用於所有單頁,如資料庫中有100條新聞記錄,那相應的生成100個新聞html頁面,格式用模板定義的格式確定)

首先模板檔案時靜態的html頁面,其中所有的需要從資料庫中替換的欄位用一對$包含,如資料庫中的新聞標題欄位為titles,則模板頁中相應的標題位置用$titles$表示,頁面如下

 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 2 <html xmlns="http://www.w3.org/1999/xhtml">
 3 <head>
 4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 5 <title>$Titles$</title>
 6 </script>
 7 </head>
 8 <body>
 9 <div id="wrap">
10   $head$
11   <!--hd end-->
12   <div class="clear"></div>
13   <div id="wp">
14   <table border="0" cellpadding="0" cellspacing="0" width="980">
15     <tr>
16       <td rowspan="3" valign="top" id="main_box" class="index_box2">
17       <div class="subtitle subtitle4"></div>
18       <div class="article">
19       <div class="title">$Titles$</div>
20          $Contents_tw$
21       </div> 
22         
23        
24       </td>
25       <td width="48" height="44" class="ri_top">&nbsp;</td>
26   </tr>
27     <tr>
28       <td class="ri_mid" id="mid_box">&nbsp;</td>
29     </tr>
30     <tr>
31       <td height="44" class="ri_bottom">&nbsp;</td>
32     </tr>
33 </table>
34   </div>
35   <!--wp end-->
36 </div>
37 <!--wrap end-->
38 
39 $foot$
40 <!--ft end-->
41 </body>
42 </html>

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

  1 public class ViewPage : StaticBase
  2     {
  3         /// <summary>
  4         /// 是否操作成功
  5         /// </summary>
  6         private bool o_sucess = true;
  7         /// <summary>
  8         /// 錯誤資訊
  9         /// </summary>
 10         private string errorstring = string.Empty;
 11         /// <summary>
 12         /// 模板檔名稱
 13         /// </summary>
 14         private string masterhtml;
 15         /// <summary>
 16         /// 資料來源 
 17         /// </summary>
 18         private IEnumerable<DataRow> rowlist;
 19         /// <summary>
 20         /// 模組類別
 21         /// </summary>
 22         private FlagsFileName fname;
 23         /// <summary>
 24         /// 指定命名檔案的標誌列(從資料庫中的欄位)
 25         /// </summary>
 26         private string thekey;
 27         public override bool Osucess
 28         {
 29             get { return o_sucess; }
 30             set { o_sucess = value; }
 31         }
 32         public override string Errorstring
 33         {
 34             get { return errorstring; }
 35             set { errorstring = value; }
 36         }
 37         /// <summary>
 38         /// 構造器靜態生成物件
 39         /// </summary>
 40         /// <param name="rlist">需要生成靜態檔案的資料來源</param>
 41         /// <param name="fn">檔案類別列舉</param>
 42         /// <param name="myid">此欄位為資料庫表中欄位,由該欄位指定生成的檔名字標誌 </param>
 43         public ViewPage(DataRow[] rlist,FlagsFileName fn,string myid)
 44         {
 45             this.thekey = myid;
 46             this.fname = fn;
 47             this.rowlist = rlist;
 48             this.masterhtml = FileName[fn] + ".html";
 49             WriteFile();
 50         }
 51 
 52         protected override bool WriteFile()
 53         {
 54             string str = "";
 55             try//從指定模板檔案中讀取html程式碼
 56             {
 57                 sr = new StreamReader(HttpContext.Current.Server.MapPath(PagePath + this.masterhtml), code);
 58                 str = sr.ReadToEnd();
 59             }
 60             catch (Exception ex)//異常則指定返回的錯誤資訊 
 61             {
 62                 sr.Close();
 63                 sr.Dispose();
 64                 this.o_sucess = false;
 65                 this.errorstring = ex.Message;
 66                 return this.o_sucess;
 67             }
 68             sr.Close();
 69             sr.Dispose();
 70             List<FlagsFileName> fn = new List<FlagsFileName>();
 71             fn.Add(FlagsFileName.head);
 72             fn.Add(FlagsFileName.foot);
 73             PointPage pg = new PointPage(fn, str);
 74             //要儲存的檔名稱
 75             string htmlfilename = string.Empty;
 76             string changestring = "";//要更改的字串
 77             foreach (DataRow row in this.rowlist)//遍歷資料來源陣列中的每個資料表
 78             {
 79                 string newString = str;
 80                 try
 81                 {
 82                     htmlfilename = FileName[fname] + "_" + row[thekey].ToString() + ".html";//給檔案命名
 83                     foreach (DataColumn c in row.Table.Columns)//遍歷單個數據表的列名
 84                     {
 85                         changestring = "$" + c.ColumnName + "$";
 86                         newString = newString.Replace(changestring, row[c].ToString());
 87                     }
 88                     sw = new StreamWriter(HttpContext.Current.Server.MapPath(SavePath + htmlfilename), false, code);
 89                     sw.Write(newString);
 90                     sw.Flush();
 91                 }
 92                 catch (Exception ex)
 93                 {
 94                     this.o_sucess = false;
 95                     this.errorstring = ex.Message;
 96                     return this.o_sucess;
 97                 }
 98 
 99             }
100             sw.Dispose();
101             sw.Close();
102             return true;
103         }
104     }

好,到這裡實現了底層的思路設計,那呼叫就很簡單了,某個aspx頁面,一個按鈕button,一個點選事件Button_Click,點選事件內需要做的就是宣告一個基類StaticBase,將它例項化成一個子類ViewPage,傳遞的引數為一個數據項集合,DataRow[]為從資料表中讀取的集合,包含需要替換的欄位,如select titles,contens,id from news(從新聞表中獲得標識id,標題,內容),以及型別FlagsFileName.News為前天基類提到過的列舉型別,為單獨頁面的生成方式,已經重新命名的標識列,如此處為id,則生成的頁面格式為

news_1.html,news_2.html以此類推,程式碼如下

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

看到這裡大家如果再從頭看一遍,相信就能知道靜態檔案的生成的原理了,接下來研究如果生成分頁頁面的靜態檔案,文章內容簡單,但希望能大家一點思路。

相關推薦

c#生成靜態html檔案封裝

由於這段時間比較輕鬆,於是想到很多的企業網站,新聞網站需要將頁面靜態化,於是寫了個封裝類來實現靜態檔案的生成,思路比較簡單,但未完善,網友可根據自己的思路將此類擴充套件,運用了簡單工廠模式(本來剛開始看設計模式,是個好書),好了,廢話不多說,先來看看靜態類的父類:StaticBase(抽象類)

asp.net(c#)生成靜態html頁面

{            string strTitle=Request.Form["Title"].ToString();            string strContent=Request.Form["Content"].ToString();            SqlServerDataBas

利用eclipse工具反向生成hibernate配置檔案domain和對映檔案

首先要意識到eclipse是一個整合開發環境,要想實現更多的功能,就必須下載好相關的外掛 1.下載外掛 點選help->install new software,輸入相應的網址(對應的自行百度),這裡是http://download.jboss.org/jbossid

c/c++生成的exe檔案無法開啟

 c/c++ 程式設計生成的.exe檔案無法開啟。      只能在編譯器上才可以開啟,一旦關了編譯器,自己編譯生成的exe檔案就打不開了。            自己編譯的程式有時運氣好的話。exe檔案可以開啟。但是大多數打不開(出現閃動一下黑視窗就沒反應了)   解決方

C++中的 靜態成員變數全域性物件單例模式

前段時間要實習一個充值介面,建立了一個類(就叫類A好了),這個類A要和另外3個類進行互動,3個類對類A修改的資料是對其他類可見的。這種情況我想到了3個方法: 1.static 靜態成員,靜態成員為該類的所有例項所共享,3個類中各自建立一個類A的物件,它們對靜態成員的修改對其他類可見。 2.全

C#獲取Internet臨時檔案獲取Cookie檔案幫助

  獲取Internet臨時檔案路徑,通過user.dll獲取到所有檔案,通過正則匹配所有Cookie檔案或者指定域名Cookie真實地址 應該使用Win7以上的,我Win7沒有問題,可以拿到Cookie地址和其內容,然後進行Cookie轉換 using Microsoft

webpack生成html檔案用於後端渲染的研究

不適用後端渲染的原因 webpack的打包方式是把所有的資源都打包成bundle.js,並用一個沒有內容的html引入生成的bundle.js,不太熟悉的同學可以參看慕課網的視訊教程。但是如果公司的建站方式是後端渲染的話(如jsp),那就不能使用webpack

生成真實靜態HTML檔案的PHP框架

首 先,我們知道在WEB系統尤其是網站類系統中,生成靜態檔案至少有著兩個好處:一、有利於網站的SEO優化。雖然現在的搜尋引擎對 http://www.php.cn/index.php?c=main&a=index,這種URL地址形式已經可以接受並且收錄了,但是從搜 索引擎對網頁的排名評級,和收錄的程

chrome瀏覽器開啟Axure原型生成html檔案總會提示需要安裝axure擴充套件的問題?

但是axure官方的擴充套件程式已經失效了,貌似是axure主程序升級後,chrome外掛不支援了。 目前最新版本是Axure RP Extension for Chrome 0.6.2,雖然能夠安裝成功。 so,我們只能通過生成html來讓團隊成員,或客戶來檢視原型效果了。 解決方案: 1、我一直使用本

Axure 生成HTML 檔案並用Chrome開啟

Axure RP是一款比較常用的原型介面工具,在用RP工具製作好原型後如何向領導或者客戶演示呢?RP工具本身自帶了釋出功能,釋出後會生成HTML檔案,只要將HTML檔案打包後共享,別人在沒有安裝RP工具的情況下也就可以正常檢視原型介面了。 一、選單欄選擇釋出:

Asp.net MVC Razor檢視模版動態渲染PDFRazor模版生成靜態Html

1.前言       上一篇文章我開源了輪子,Asp.net Core 3.1 Razor檢視模版動態渲染PDF,然後,很多小夥伴有很多私信找我了。那麼我下面就簡單的給大家說一下,關於小夥伴問的這些問題。 我專案的電子簽章部分程式碼可否開源?   答:我專案電子簽章也是使用第三方的電子簽章,電子

java基礎 靜態 static 問在多態中靜態方法覆蓋父靜態方法時引用調用的是哪個方法?

xtend java pos main 靜態方法 show extends ava pri 多態 package com.swift.jiekou; public class Jicheng_Tuotai_jingtai_diaoyong { publ

C#生成二維碼裁切邊框

google tasks html fff white zxing ace sta wim 使用google zxing生成的二維碼帶有白色邊框,顯示在報告(使用Crystal Report 水晶報表)上時,由於空間有限造成二維碼過小難以掃描識別。 通過將白色邊框裁切掉,

C/C++生成的exe檔案如何傳引數到main中

Main函式引數argc,argv說明:   C/C++語言中的main函式,經常帶有引數argc,argv,如下:    int main(int argc, char** argv) int main(int argc, char

Makefile學習(二)----生成靜態檔案

Lunix下編譯靜態庫檔案: .o字尾檔案:編譯生成的中間程式碼檔案; .a字尾檔案:靜態庫檔案,編譯的時候會合到可執行程式中,檔案比較大; .so字尾檔案:動態庫檔案,只是一個指向,不會合到可執行程式中,當要呼叫函式庫的時候才使用;   用一個簡單的例子闡述下在lunix環境下生成靜態庫

c++三大特性(繼承封裝多型)及過載與多型的區別。

    封裝可以隱藏實現細節,使得程式碼模組化,繼承可以擴充套件已存在的模組,它們目的都是為了:程式碼重用。而多型是為了實現另一個目的:介面重用。     封裝是面向物件的特徵之一,是物件和類概念的主要特性。封裝是把過程和資料包圍起來,

pyinstaller 打包生成的exe檔案在其他電腦上報錯

  解決方法: 1、第一種情況,在打包的時候不要加引數-w,看一下執行exe檔案後出現的報錯再看下一步的行動 2、應該是需要裝一個VC 2015 x64(下載地址:https://www.microsoft.com/en-us/download/details.aspx?id=526

【轉】在VS2010上使用C#呼叫非託管C++生成的DLL檔案(圖文講解)

原文:http://www.cyqdata.com/cnblogs/article-detail-35876# 背景       在專案過程中,有時候你需要呼叫非C#編寫的DLL檔案,尤其在使用一些第三方通訊元件的時候,通過C#來開發應用軟體時,就需要利用

七、如何訪問到靜態檔案如jpg,js,css?

如何你的DispatcherServlet攔截"*.do"這樣的有後綴的URL,就不存在訪問不到靜態資源的問題。 如果你的DispatcherServlet攔截"/",為了實現REST風格,攔截了所有的請求,那麼同時對*.js,*.jpg等靜態檔案的訪問也就被攔截了。 我們要

python 一個HTML檔案找出正文和連結

from bs4 import BeautifulSoup def sechBodyURL(path):   #此處因為我的html檔案編碼格式為gbk,因此加了encoding fp=open(path,encoding='gbk',errors='ignore