做也有幾年了。自己在不同的公司有不同的認識。最近做blog項目。自己認識到了模板類在中的作用。自己晚上在家。總想可以做一個專門的為asp.ne開發而設計的模板類。于是就寫了這個模板類。
下載地址點這
把下載下來的 500sea.txt 文件改名為 templet.rar 文件打開就可以
如果打開
http://img.club.163.com/images/user/other/500sea
沒有提示 500sea.txt文件下載。那就用網絡快車等東西下這個地址
把下來的500sea.txt文件 改為 *.rar 文件就好
下面是里面的一個說明文件
//----------------------------------------------//
介紹:
此模板類是為三層架構web站點開發而編寫的。stringtempletreplet.dll組件
內包含模板類。stringtempletreplet命名空間內的模板類可以使用在ui層,也可
以使用在邏輯層。
***************************************************************
運行方法:
建立一個名叫 templet 的虛擬目錄指象解壓后的 templet 文件夾
運行內部的 retuenstring.aspx,returntext.aspx,writearticon.aspx,
longloop.aspx 頁面。在頁面對應的cs文件上有相應說明。
第一次打開頁面應為要保留委托對象和模板文件到緩存中,所以真正的速度要看第
一次以后的。
************************************************************
原理介紹:
一種標簽替換的模板。使用了c#中的指針運算查找標簽位置。
用委托對象指象標簽對應的解析函數,并用靜態對象緩存全部委托對象。
在不改變模板正文的情況下,緩存全部模板內容。可以動態更換模板。
************************************************************
標簽介紹:
在成對特殊符號{$ 和 $} 之間的內容為標簽
如
{$標簽名:參數1:參數2:參數3::字符10$}
{$標簽名:參數1:參數2::字節10$}
{$dt[5][name]$}
在標簽內部通過 :: 符號把標簽分為 (標簽參數部分) 和 (命令控制部分) 兩快
{$標簽名:參數1:參數2:參數3::字節10$}
(標簽參數部分) :: (命令控制部分)
在這兩部分內以:號分割標簽參數部分和命令控制部分
標簽參數部分 ---第一個為標簽名,就是標簽解析函數的對應名稱,以后的為函數的參數,
標簽解析函數接受全部參數類型為string類型的,參數個數為0--20個的
函數,返回類型為string類型。參數可在標簽上寫死,也可以動態寫入。
命令控制部分 ---現在只有兩個命令符號 字符 和 字節 ,后帶一個數字參數,表示截取標
簽解析結果的長度, 如 字符10 字節10 。
我以后會在擴展其他的命令控制符號。
標簽和函數對應請看business.cs 文件內說明
標簽具體使用規則請看templet/templet/aa1.htm 模板內說明
具體調用規則請看項目中的這三個aspx頁面
writearticon.aspx -- 讀模板 解析 寫入文件 用于產生靜態頁面的新聞系統
returntext.aspx -- 讀模板 解析 返回字符串 用與寫經常要改變外觀的頁面,
換皮膚的頁面。可動態更換模板 。
retuenstring.aspx -- 接受標簽字符串,返回解析結果。常用與ajax。
*************************************************************
標簽動態取值:
標簽解析函數除可以接受標簽內傳來的固定參數外。可以有三種方式接受動態參數
象模板類傳遞 datatable 和 hashtable 對象以后
(datatable 從數據層獲取 ,hashtable 一般是頁面變量 和其他變量)
1。 dt[5][name] ---- 表示取datatable內5行name列上的數值,第一個為數字,
第二個是列名
2。 dt[name] ---- 在loop循環外表示取datatable內0行name列上的數值,
一個參數表示列名
---- 在loop循環內表示取datatable內name列上的數值,取那
些行通過loop標簽的參數決定
3。 page[pageid] ----- 表示取hashtable對象內pageid鍵上的數值,返回string類型
如 {$二個參數書簽:dt[3][word]:page[userid]::字符10$}
{$dt[5][name]$} {$dt[name]$} {$page[pageid]$}
或
{$dt[5][name]::字符10$} {$dt[name]::字符10$} {$page[pageid]::字符10$}
這樣的標簽表示直接在頁面上顯示對象內的數值
************************************************************
頁面或類內調用模板類方法:
可在頁面或類內調用
產生對象,關聯對應標簽函數解析類
//在這里我門只要在這一行后面 new business() 一個business類對象就可以了
//用接口實現多態,代碼看起來有點麻煩。 自己用的時候只要修改最后一個"new business()" 為自己的包含標簽解析函數的類就可以了
ilabelanalystart objilabel=(ilabelanalystart) new templetreplet(new business());
//讀模板路徑屬性
objilabel.readfilepath=this.server.mappath("templet/aa1.htm");
//寫文件路徑屬性
objilabel.writfilepath=this.server.mappath("page/aa1.html");
//獲取數據表對象
objilabel.labeldatatable=ds.tables[0];
//把這個頁面上的變量用hashtable對象傳近模板類
objilabel.labelhashtable=ht;
然后可以實現三種替換
//開始替換寫模板
objilabel.laberreplet();
//返回解析結果
string aa=objilabel.laberreplettext();
//返回解析結果,這個是直接接受模板字符串的,具體看retuenstring.cs文件
string aa=objilabel.laberrepletstring();
詳細可看這三個文件的cs文件
writearticon.aspx -- 讀模板 解析 寫入文件 用于產生靜態頁面的新聞系統
returntext.aspx -- 讀模板 解析 返回字符串 用與寫經常要改變外觀的頁面
換皮膚的頁面
retuenstring.aspx -- 接受標簽字符串 返回解析結果。常用與ajax
*********************************************************
標簽函數關聯:
具體詳細請看 business.cs 文件
在邏輯層對應的類的靜態構造器內,加如下代碼。
//調用靜態構造器,把標簽執行函數委托放到靜態哈希表內
//必須執行這個方法
static business()
{
business _this=new business();
functionlist.objfunctionhashtable.add("無參書簽",new keyitemdelegate(new userdelegate.run_0(_this.show),0));
functionlist.objfunctionhashtable.add("一個參數書簽",new keyitemdelegate(new userdelegate.run_1(_this.tag),1));
functionlist.objfunctionhashtable.add("二個參數書簽",new keyitemdelegate(new userdelegate.run_2(_this.tag_two),2));
//書簽和執行函數關聯。放到書簽解析類的靜態構造函數內。是為了可以完全使用內存中的對象,不每次都執行
// "一個參數書簽" 字符對應 public string tag(string aa) 函數 對應模式為在哈希表上加key和value
// ("一個參數書簽",new keyitemdelegate(new userdelegate.run_1(_this.tag),1));
// 標簽名 | | |
// 一個參數就用run_1委托。 | |
// 對應的標簽執行函數 |
// 一個參數就寫數字一
// 0 個或多個上面有對應例子
}
具體詳細請看 business.cs 文件
***********************************************************
標簽內loop循環介紹:
標簽內通過一些特殊符號,可以實現非嵌套loop循環
//-------------------------------------------------------------
{$loop(3,0,alter)$} //顯示三行,從0行開始,如果有交替列,運行交替列
{$blockitem$} //默認的循環行,
<td bgcolor="#33ccff">標題:{$dt[5][name]$} , 作者:{$一個參數:dt[dddf]$}</td>
{$/blockitem$}
{$blockalteritem$} // 交替循環行 當沒有默認行標簽對,有交替循標簽對。就把交替循標簽對當默認行標簽對
<td bgcolor="#ff6699">標題:{$dt[5][name]$} , 作者:{$一個參數:dt[dddf]$}</td>
{$/blockalteritem$}
{$blockpatch$} //當要循環的行數大于datatable內的行數時,用這里的內容補充顯示 。 如果沒有 “補充” 標簽對。那么當顯示行數大于datatable中的行數時,將只顯示datatable中的行數
<td bgcolor="#33ccff">補充(里面也可以使用標簽)</td>
{$/blockpatch$}
{$blockalterpatch$} //沒有補充標簽對,有交替補充標簽對。就把交替補充標簽對當補充標簽對
<td bgcolor="#ff6699">交替補充(里面也可以使用標簽)</td>
{$/blockalterpatch$}
{$/loop$} //循環結束
//-------------------------------------------------------
{$blockitem$} {$/blockitem$} :默認的循環行標簽對
{$blockalteritem$} {$/blockalteritem$} :交替循環行標簽對
{$blockpatch$} {$/blockpatch$} :默認補充行標簽對
{$blockalterpatch$} {$/blockalterpatch$} :交替補充行標簽對
//------------------------------------------------------
如果只有默認的循環行可以不加{$blockitem$}標簽對
如
{$loop(3,0,alter)$}
<tr><td>{$函數標簽$}</td></tr>
{$/loop$}
和
{$loop(3,0,alter)$}
{$blockitem$}<tr><td>{$函數標簽$}</td></tr>{$/blockitem$}
{$/loop$}
是表示一樣的效果
//-------------------------------------------------
{$loop(3,0,alter)$}
{$blockalterpatch$}
<tr><td>{$函數標簽$}</td></tr>
{$/blockalterpatch$}
{$/loop$}
如果只有交替循環行標簽對沒有默認的循環行標簽對那么交替循環行標簽對將自動轉換為
默認循環行標簽對
//-----------------------------------------------
{$loop(3,0,alter)$}
{$blockalterpatch$}
<tr><td>{$函數標簽$}</td></tr>
{$/blockalterpatch$}
{$/loop$}
如果只有交替補充行標簽對沒有默認補充行標簽對那么交替補充行標簽對將自動轉換為
默認循環行標簽對
***********************************************************
loop參數說明:
{$loop(3,0,alter)$}
loop上一共有三個參數,可適當減少
第一個參數:
3:循環3次 ,沒有表示循環全部
第二個參數:
2:從2開始,沒有表示從0開始
第三個參數:
alter:交替
noalter:不交替 ,沒有表示默認為交替,所以alter加不加是一樣的
如果三個參數全不寫,至少要保留一對空括號 {$loop()$}
表示循環datatable內的行數
從0行開始,有補充就顯示補充。
*********************************************************
有更新了一下。主要是優化循環。
現在循環5萬行的表格要 300-400 毫秒。
*********************************************************
建議模板不要大于85k,小心成為大尺寸對象。那可是二代對象
建議頁面模板小于等于919個,對應函數標簽建議不超過1597個。
很高興看見模板類和我自己的認識一起成長。
*********************************************************
新聞熱點
疑難解答
圖片精選