asp.net|模板
做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("一個參數書籤",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個。
很高興看見模板類和我自己的認識一起成長。
*********************************************************