做web開發也有幾年了。自己在不同的公司有不同的認識。最近做blog專案。自己認識到了模板類別在web開發中的作用。自己晚上在家。總想可以做一個專門的為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("一個參數書籤),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個。
很高興看到模板類別和我自己的認識一起成長。
************************************************** ***************************