(转)vtemplate
本文轉載自:http://www.cnblogs.com/wfnice12/archive/2009/11/03/1594922.html
1、什么是VTemplate?VTemplate是一個免費的開源(采用LGPL開源許可協議)模板引擎,用于解析運行VT模板; 其主要目標是為ASP.Net開發提供另外一種技術選擇方案,以保證用簡單的語法,良好的結構,不混雜業務邏輯的方式書寫頁面; 適合于充當Model-View-Controller(MVC)模式應用的View角色,以使能更好的分離頁面設計人員與業務開發人員的職責; 也可以作為動態文本生成工具,生成HTML、XML、Mail、程序源代碼或其它文本等。
?
2、VTemplate模版范例:
| <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> |
以上模版代碼經過VTemplate解析運行后將輸出一個99乘法表,如下:
| 1*1=1???? |
而程序處理代碼則只有簡單的兩行,如下:
注:假設上面的模版代碼存放在test1.html文件上
| TemplateDocument document = new TemplateDocument(Server.MapPath("template/test1.html"), Encoding.UTF8); document.Render(Response.Output); |
?
?
3、什么是VT模版元素?
VT模版元素VTemplate模版引擎定義的有特殊作用的模版語言元素,分為標簽元素和變量元素。
3.1、標簽元素都是程序邏輯控制元素,是標準的HTML標簽元素,如上例中用于循環處理的<vt:for>標簽和用于計算表達式值的<vt:expression>標簽等
3.2、變量元素是數據輸出元素,其格式是以“{$:”字符開頭,以“}”字符結束。 如上例中的{$:i}、{$:j}和{$:r}等
4、變量與變量表達式
4.1、變量是VTemplate模版引擎中的核心元素,用于存儲或控制數據的輸出,其類似于程序語言中的“變量”概念,定義格式也是一樣。如上例中的i,j,r變量。
4.2、變量表達式則是定義獲取變量中某個字段、屬性或函數方法結果值。
定義格式為:“前綴.變量.變量字段/屬性/函數方法/索引值”。
前綴:以#號開頭后跟模版塊的Id值,用于指示此變量是取自于對應Id的模版塊下的變量,如#my.user則表示user變量是取自于Id為my的模版塊下的變量;如果省略Id號,即前綴只為#號,則表示是當前模版塊下的變量;而如果前綴是“##”,則表示是當前模版塊的父模版塊(如果不存在父級模版塊則為當前模版塊)下的變量;如果省略前綴,則表示是文檔(根)模版塊的變量。
變量字段/屬性/函數方法/索引值:表示要從變量中取得數據的字段/屬性/函數方法/索引值(數字),其中函數方法只支持不帶參數的方法。此段可以定義0次或多次。
例子:
| #my.user | Id為my的模版塊下的變量user的值 |
| #my.user.age | Id為my的模版塊下的變量user的age屬性/字段值 |
| #my.user.location.getcity() | Id為my的模版塊下的變量user的location屬性/字段值的getcity方法返回的值 |
| #.user | 當前模版塊下的變量user的值 |
| #.user.age.tostring() | 當前模版塊下的變量user的age屬性/字段值的tostring方法返回的值 |
| ##.user.location.city | 當前模版塊的父級模版塊的變量user的location屬性/字段值的city屬性/字段的值 |
| user.age | 文檔(根)模版塊的變量user的age屬性/字段值 |
| weeks.0 | 文檔(根)模版塊的變量weeks的0索引位置的值 |
| #.users.0.name | 當前模版塊下變量users的0索引位置的值的name字段/屬性值 |
注:變量表達式可在“變量元素”或“標簽元素”的部分屬性值中使用。
5、標簽元素:
5.1、<vt:template>模版塊標簽元素
此標簽用于定義模版塊。在VTemplate的模版規范中,變量是基于模版塊存在的,同模版塊下同名的變量都是引用同一個變量實例,但不同模版塊中的同名變量都是互相獨立互不影響的。
標簽樣例:
<vt:template id="mytemplate" name="mytemplate">…………………………</vt:template>
或自閉合的樣例:
<vt:template id="filetemplate" file="include/myfile.html" charset="utf-8" />
標簽中已定義的屬性列表:
| 名稱 | 說明 |
| id | 標簽元素的Id,建議唯一但不強制。(可不定義) |
| name | 標簽元素的名稱。(可不定義) |
| file | 模版塊數據文件的路徑地址,可以絕對或相對地址 |
| charset | 模版塊數據文件的編碼,如果未定義則如果存在父級模版塊的話則采用父級模版塊的編碼,否則采用系統默認編碼 |
| render | 定義用于處理此模塊數據的實例,格式:"類實例,程序集"。如果已定義此屬性但未定義rendermethod屬性,則類實例必須已實現ITemplateRender接口。(可不定義) |
| rendermethod | 定義用于處理此模塊數據的類實例的方法,此方法必須已標記TemplateRenderMethodAttribute特性。(可不定義) |
?
5.2、<vt:include>文件包含標簽元素
此標簽用于包含外部文件。
標簽樣例:
<vt:include file="include/myfile.html" charset="utf-8">…………………………</vt:include>
或自閉合的樣例:
<vt:include file="include/myfile.html" charset="utf-8" />
標簽中已定義的屬性列表:
| 名稱 | 說明 |
| id | 標簽元素的Id,建議唯一但不強制。(可不定義) |
| name | 標簽元素的名稱。(可不定義) |
| file | 模版塊數據文件的路徑地址,可以絕對或相對地址 |
| charset | 模版塊數據文件的編碼,如果未定義此屬性則如果存在父級模版塊的話則采用父級模版塊的編碼,否則采用系統默認編碼 |
?
5.3、<vt:for>循環標簽元素
此標簽用于定義數據循環,類似于程序語言中的for循環。
標簽樣例:
<vt:for from="1" to="9" index="i">…………………………</vt:for>
標簽中已定義的屬性列表:
| 名稱 | 說明 |
| id | 標簽元素的Id,建議唯一但不強制。(可不定義) |
| name | 標簽元素的名稱。(可不定義) |
| from | 循環起始值,可為一個數值常量(如:1)或變量表達式(必須以$字符開頭,如:$i) |
| to | 循環結束值,可為一個數值常量(如:1)或變量表達式(必須以$字符開頭,如:$i) |
| step | 循環值的步值,可為一個數值常量(如:1)或變量表達式(必須以$字符開頭,如:$i),如果未定義此屬性,則默認為1 |
| index | 定義存儲循環索引值的變量,注:此索引值是一個LoopIndex實例。(可不定義) |
?
?
5.4、<vt:foreach>集合數據循環標簽元素
此標簽用于定義處理集合數據的循環,類似于程序語言中的foreach循環。
標簽樣例:
<vt:foreach from="users" item="user" index="i">…………………………</vt:foreach>
標簽中已定義的屬性列表:
| 名稱 | 說明 |
| id | 標簽元素的Id,建議唯一但不強制。(可不定義) |
| name | 標簽元素的名稱。(可不定義) |
| from | 變量表達式 |
| item | 定義存儲當前循環值的變量。(可不定義) |
| index | 定義存儲循環索引值的變量,注:此索引值是一個LoopIndex實例。(可不定義) |
| groupsize | 設置拆分數據集合時的組大小。(可不定義) 例如:from的變量表達式的結果值原是“1,2,3,4,5,6”數組集合,如果groupsize設置為2,則將會拆成"[1,2],[3,4],[5,6]"的數據集合,再用此新的數據集合進行循環解析。 |
?
5.5、<vt:foreachelse>空集合數據循環標簽元素
此標簽用于定義當集合數據為空(數量為0)時顯示處理的節點。此標簽必須在<vt:foreach>標簽中定義,并且此標簽為單節點標簽(即不需要配對的結束標簽)。
標簽樣例:
<vt:foreach from="users" item="user" index="i">
{$:i}、我叫{$:user.name},今年{$:user.age}歲
<vt:foreachelse />
沒有任何用戶
</vt:foreach>
注:當users集合數據為空時則顯示"沒有任何用戶"字樣,否則不顯示此字樣。
?
標簽中已定義的屬性列表:
| 名稱 | 說明 |
| id | 標簽元素的Id,建議唯一但不強制。(可不定義) |
| name | 標簽元素的名稱。(可不定義) |
?
5.6、<vt:if>條件判斷標簽元素
此標簽用于定義數據條件判斷,類似于程序語言中的if語句。
標簽樣例:
<vt:if var="user.age" value="20" compare=">">…………………………</vt:if>
標簽中已定義的屬性列表:
| 名稱 | 說明 |
| id | 標簽元素的Id,建議唯一但不強制。(可不定義) |
| name | 標簽元素的名稱。(可不定義) |
| var | 用于判斷條件的變量表達式 |
| value | 用于比較條件的值,可為數值/字符串常量或變量表達式(必須以$字符開頭,如:$i) 注:此屬性可以多次定義,當var變量表達式中的值和其中一個value屬性值匹配時即符合條件。 |
| compare | 比較的方式,可以為以下幾種: > : 大于 >= : 大于等于 < : 小于 <= : 小于等于 !=或<> : 不等于 = 或== : 相等 如果未定義此屬性則表示采用“相等”比較。 |
| expression | 定義需要簡單運算的表達式,表達式中支持 “{0}”標記,用于代替var屬性的變量表達式的值。(可不定義) |
?
5.7、<vt:elseif>條件分支判斷標簽元素
此標簽用于定義數據條件的分支判斷。類似于程序語言中的else if語句。此標簽可以同時支付一個或多個。此標簽只能在<vt:if>標簽中定義,并且此標簽為單節點標簽(即不需要配對的結束標簽)。
標簽樣例:
<vt:if var="user.age" value="20">
20歲用戶
<vt:elseif value="30” />
30歲用戶
<vt:elseif value="40” />
40歲用戶
</vt:if>
標簽中已定義的屬性列表:
| 名稱 | 說明 |
| id | 標簽元素的Id,建議唯一但不強制。(可不定義) |
| name | 標簽元素的名稱。(可不定義) |
| var | 用于判斷條件的變量表達式。如果未定義此屬性,則為標簽所在的<vt:if>標簽中的var屬性值 |
| value | 用于比較條件的值,可為數值/字符串常量或變量表達式(必須以$字符開頭,如:$i) 注:此屬性可以多次定義,當var變量表達式中的值和其中一個value屬性值匹配時即符合條件。 |
| compare | 比較的方式,可以為以下幾種: > : 大于 >= : 大于等于 < : 小于 <= : 小于等于 !=或<> : 不等于 = 或== : 相等 如果未定義此屬性則表示采用“相等”比較。 |
| expression | 定義需要簡單運算的表達式,表達式中支持 “{0}”標記,用于代替var屬性的變量表達式的值。(可不定義) |
?
5.8、<vt:else>條件分支判斷標簽元素
此標簽用于定義數據條件的分支判斷,即當<vt:if>標簽中的所有條件分支都條件不成立時用于顯示處理的節點。類似于程序語言中的else語句。此標簽只能在<vt:if>標簽中定義,并且此標簽為單節點標簽(即不需要配對的結束標簽)。
標簽樣例:
<vt:if var="user.age" value="20">
20歲用戶
<vt:elseif value="30” />
30歲用戶
<vt:else />
未知歲數
</vt:if>
標簽中已定義的屬性列表:
| 名稱 | 說明 |
| id | 標簽元素的Id,建議唯一但不強制。(可不定義) |
| name | 標簽元素的名稱。(可不定義) |
?
5.9、<vt:expression>表達式標簽元素
此標簽用于對變量表達式進行簡單數據運算。
標簽樣例:
<vt:expression var="r" args="i" args="j" expression="{0}*{1}" />
?
標簽中已定義的屬性列表:
| 名稱 | 說明 |
| id | 標簽元素的Id,建議唯一但不強制。(可不定義) |
| name | 標簽元素的名稱。(可不定義) |
| var | 存儲表達式運算結果的變量 |
| args | 參與表達式計算的變量表達式。(可不定義) 注:此屬性可以多次定義,在表達式中分別以{0},{1}表示各個args屬性的變量表達式值 |
| expression | 要進行運算的表達式。 |
| output | 是否在解析標簽時輸出標簽的結果值true/false,如果定義此屬性且值設為true,則可以不定義var屬性(即不存儲結果值),默認不輸出標簽結果值。(可不定義) |
?
5.10、<vt:serverdata>服務器數據標簽元素
此標簽用于獲取服務器的部分數據,如Session、Application、DateTime等等。
標簽樣例:
<vt:serverdata var="session" type="session" item="username" />
?
標簽中已定義的屬性列表:
?
| 名稱 | 說明 | ||||||||||||||||||||||||||
| id | 標簽元素的Id,建議唯一但不強制。(可不定義) | ||||||||||||||||||||||||||
| name | 標簽元素的名稱。(可不定義) | ||||||||||||||||||||||||||
| var | 存儲服務器數據的變量 | ||||||||||||||||||||||||||
| type | 要獲取服務器數據的類型。支持以下幾種: ?
? | ||||||||||||||||||||||||||
| item | 要獲取的數據項,此屬性值根據type值而具有不同的意義,具體的看上表。 | ||||||||||||||||||||||||||
| output | 是否在解析標簽時輸出標簽的結果值true/false,如果定義此屬性且值設為true,則可以不定義var屬性(即不存儲結果值),默認不輸出標簽結果值。(可不定義) |
?
??
5.11、<vt:datareader>數據讀取標簽元素
此標簽用于直接從數據源讀取數據。
注意:此標簽必須采用TagOpenMode=Full的TemplateDocumentConfig時才允許使用。
標簽樣例:
<vt:datareader var="members" connection="memberdb" commandtext="select * from [member]" />
??
標簽中已定義的屬性列表:
?
| 名稱 | 說明 |
| id | 標簽元素的Id,建議唯一但不強制。(可不定義) |
| name | 標簽元素的名稱。(可不定義) |
| var | 存儲返回數據的變量 |
| connection | 數據源名稱.此名稱必須已在項目配置文件(如:web.config)里的connectionStrings節點里定義. |
| commandtext | 數據查詢語句(SQL語句)? |
| rowindex | 要獲取行的行號(可不定義) 注:當此值不定義時將返回一個表結構(DataTable),而如果定義此值,則將返回對應行的數據行(DataRow),如果行不存在則返回null |
| parameters | 數據查詢語句中的附加參數的變量表達式(可不定義) 例子: |
?
?
?
5.12、<vt:function>函數調用標簽元素
此標簽用于直接調用函數。標簽樣例:
<vt:functionvar="days" method="DaysInMonth" type="System.DateTime" args="2009" args="10"?/>
<vt:functionvar="UTCTime" method="ToUniversalTime" type="$time" />
??
標簽中已定義的屬性列表:
?
| 名稱 | 說明 |
| id | 標簽元素的Id,建議唯一但不強制。(可不定義) |
| name | 標簽元素的名稱。(可不定義) |
| var | 存儲函數返回值的變量 |
| method | 函數方法名. |
| type | 包含靜態函數方法的類型或包含函數方法的變量表達式(必須以$字符開頭,如:$i) |
| args | 參與函數運算的參數,可為數值/字符串常量或變量表達式(必須以$字符開頭,如:$i) (可不定義) |
| output | 是否在解析標簽時輸出標簽的結果值true/false,如果定義此屬性且值設為true,則可以不定義var屬性(即不存儲結果值),默認不輸出標簽結果值。(可不定義) |
?
?
5.13、<vt:property>獲取字段或屬性值標簽元素
此標簽用于直接獲取字段或屬性值。標簽樣例:
<vt:property var="time" field="Now" type="System.DateTime" />
<vt:property var="year" field="Year" type="$time" />
??
標簽中已定義的屬性列表:
?
| 名稱 | 說明 |
| id | 標簽元素的Id,建議唯一但不強制。(可不定義) |
| name | 標簽元素的名稱。(可不定義) |
| var | 存儲字段或屬性值的變量 |
| field | 字段或屬性名. |
| type | 包含靜態字段或屬性的類型或包含字段或屬性的變量表達式(必須以$字符開頭,如:$i) |
| output | 是否在解析標簽時輸出標簽的結果值true/false,如果定義此屬性且值設為true,則可以不定義var屬性(即不存儲結果值),默認不輸出標簽結果值。(可不定義) |
?
?
5.14、<vt:set>變量賦值標簽元素
此標簽用于向模版變量賦值。標簽樣例:
<vt:set var="time"?value="2009-08-09" />
<vt:set var="time" value="$year" value="$month" value="$day" format="{0}-{1}-{2}" />
??
標簽中已定義的屬性列表:
?
| 名稱 | 說明 |
| id | 標簽元素的Id,建議唯一但不強制。(可不定義) |
| name | 標簽元素的名稱。(可不定義) |
| var | 需要賦值的變量名 |
| value | 要賦于變量的值,可為數值/字符串常量或變量表達式(必須以$字符開頭,如:$i) |
| format | 用于格式化變量值的格式。(可不定義) 注:在格式表達式中分別以{0},{1}表示各個value屬性的變量值 |
| output | 是否在解析標簽時輸出標簽的結果值true/false,如果定義此屬性且值設為true,則可以不定義var屬性(即不存儲結果值),默認不輸出標簽結果值。(可不定義) |
?
?
?
6、變量元素
變量元素主要用于輸出變量表達式的值。其定義格式為:
{$:變量表達式 屬性="屬性值"}
例子:
{$:i}、{$:user.age format=”00”}、{$:user.name length=”20” htmlencode=”true”}
{$:#my.i}、{$:##.user.age}、{$:#my.user.location.getcity() htmlencode=”true”}
?
元素中已定義的屬性列表:
| 名稱 | 說明 |
| htmlencode | 輸出變量表達式的值時是否需要進行HTML字符編碼。true/false,默認為false(可不定義) |
| urlencode | 輸出變量表達式的值時是否需要進行URL字符編碼。true/false,默認為false(可不定義) |
| xmlencode | 輸出變量表達式的值時是否需要進行XML字符編碼。true/false,默認為false(可不定義) |
| textencode | 輸出變量表達式的值時是否需要進行文本字符編碼(先進行HTML字符編碼,再將“空格”轉換為" ”;“回車換行”轉換為"<br />”字符)。true/false,默認為false(可不定義) |
| jsencode | 輸出變量表達式的值時是否需要進行Javascript腳本字符編碼。true/false,默認為false(可不定義) |
| format | 用于格式化變量表達式的值的格式(如果變量表達的值已實現IFormattable接口則調用接口方法,否則調用String.Format方法)。(可不定義) |
| length | 輸出變量表達的值時的最大長度。如果值的字符長度超出此定義的值,則將進行字符截取。默認為0不截取(可不定義) |
| charset | 定義在進行urlencode或length截取字符時采用的編碼。默認為所在模版塊的charset(可不定義) |
| appendtext | 定義文本在輸出時如果被裁剪后要附加顯示的文本。(可不定義) |
| call | 在輸出變量表達式的值前需要調用的函數名稱。(可不定義) 注:此屬性可以多次定義,模版引擎將根據定義順序先后調用函數。函數的原型參考VariableFunction委托 |
?
7、注釋標簽:
???? 注:注釋標簽只在2.1以上版本有效
???? 格式:<!--vt[注釋文字]-->
???? 注釋標簽在解析輸出時不會被輸出顯示,并且注釋里面可以書寫任何的標簽元素,都不會被VTemplate模版引擎解析。
???? 例子:
???? <!--vt[這是VT的注釋代碼,下面的標簽不會被解析到<vt:serverdata type="time" output="true" />。]-->
?
8、項目托管:
VTemplate項目托管在Google code上。
URL: http://net-vtemplate.googlecode.com/
SVN: http://net-vtemplate.googlecode.com/svn/src/VTemplate.Engine/
?例子請參考VTemplate.WebTester項目:
?http://net-vtemplate.googlecode.com/svn/src/VTemplate.WebTester/
或觀看在線演示例子:(感謝網友“DOLT” 提供)
http://222.76.217.250:8888/index.ashx
注:已建立VTemplate模版引擎技術交流QQ群,歡迎各位加入參與項目開發或技術探討。QQ群:884468
?
?
2、VTemplate模板的特色:
?
2.1、VT是一種解釋型的模板引擎,所以你可以隨時更改你的模板代碼以獲得不同的輸出,而不需要重新編譯程序代碼
2.2、VT支持緩存,也就是模板只需要解析一次,下次就可以直接從內存里構建您的模板對象而不需要再次解析模板代碼,除非相關的模板文件已被修改。
2.3、VT的模板標簽語法是基于HTML規范定義的元素,所以對頁面設計人員來說是非常友好的。
2.4、VT模板支持循環、條件判斷、數值表達式計算等,以方便你在模板里直接進行邏輯處理。
2.5、VT支持直接調用對象里的方法
例子:
------------模板代碼--------------
<vt:function var="data" method="GetData" type="$user" />
<vt:set var="data" value="$user.GetData()" />
----------------------------------
上面模板里第一種采用function標簽調用user對象的GetData方法,第二種則直接采用變量表達式執行方法。
2.6、VT可以很靈活的直接獲取對象的屬性、字段、集合項等數據。
例子:
------------模板代碼--------------
<h4>姓名:{$user.name}</h4>
----------------------------------
上面的變量元素里,user可以為
public class user{
?public string name;
}
也可以為
public class user{
?public string name{get;set;}
}
也可以為
var user = new Dictionary<string, string>();
user.Add("name","張三");
VT會自動判斷user對象的name是存在于對象的字段、屬性還是集合項里。
?
<vt:foreach from=”$blogarchive.comments” item=”#.comment” index=”#.floor”><hr class=”blogsplit”/> <div class=”blogcomment”>#{$:#.floor}樓 {$:#.comment.time format=”yyyy-MM-dd HH:mm”} | {$:#.comment.author htmlencode=”true”} </div><div style="padding-left: 20px">{$:#.comment.content htmlencode=”true”}</div></vt:foreach>利用我們上面設計好的VT模板,我們實例化VTemplate模板引擎的里的模板文檔對象TemplateDocument。
假如我們的VT模板保存在blogarchive.html文件里,則實例化代碼如下:
TemplateDocument document = new TemplateDocument(context.Server.MapPath("template/blogarchive.html"), Encoding.UTF8);或者我們從緩存模板里構造實例:
TemplateDocument document = TemplateDocument.FromFileCache(context.Server.MapPath("template/blogarchive.html"), Encoding.UTF8);到此,我們就可以使用document對象來操作VT模板變量里的元素對象了,比如對VT模板里紅色的blogarchive變量賦于某篇博客日記數據,如下:
//對VT模板里的blogarchive變量賦值 document.Variables.SetValue("blogarchive", this.GetBlogArchive()); 注:對于GetBlogArchive()方法,則只是一個獲取數據實體的函數,比如從數據庫獲取的數據實體。?
經過這簡單的兩步操作,我們就已完成了對VT模板的操作,剩下就是“告訴”模板引擎將數據呈現出來,我們的博客日記頁面就做好了;)是不是很簡單?
//輸出最終呈現的數據 document.Render(context.Response.Output);?
總結
以上是生活随笔為你收集整理的(转)vtemplate的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [iBoard 电子学堂][第八卷 设计
- 下一篇: 步步为营UML建模系列总结