c#應用簡略工場形式完成生成html文件的封裝類分享。本站提示廣大學習愛好者:(c#應用簡略工場形式完成生成html文件的封裝類分享)文章只能為提供參考,不一定能成為您想要的結果。以下是c#應用簡略工場形式完成生成html文件的封裝類分享正文
因為這段時光比擬輕松,因而想到許多的企業網站,消息網站須要將頁面靜態化,因而寫了個封裝類來完成靜態文件的生成,思緒比擬簡略,但未完美,網友可依據本身的思緒將此類擴大,應用了簡略工場形式,先來看看靜態類的父類: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.WordStr(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>");
}
}
}
看到這裡年夜家假如再從頭看一遍,信任就可以曉得靜態文件的生成的道理了。