1、<vt:template>與<vt:include>標簽的不同
<vt:template>和<vt:include> 標簽都包含file屬性,如果這兩個標簽都設置file屬性,那這兩個標簽看起來很相似,並且最終效果都是將文件的內容包含進來。但是對於模版引擎來說它們之間的差別卻是非常的大。
<vt:template>標簽是“模版塊”標簽,它能擁有自己的“變量”,它會成為它內部的標簽的“宿主模版”(OwnerTemplate)。而<vt:include>則只是簡單的將文件內容包含進來,它內部的標簽的“宿主模版”與它相同。
現假如有一個VT模版文件: inc_content.Html
我是包含文件裡的變量 {$:#.var1}。
我是包含文件裡的foreach標簽:
<vt:foreach from=”#.names” item=”name” index=”i”>
包含文件的第{$:#.i}個名字叫{$:#.name}。
< /vt:foreach>
現分別用<vt:template> 和 <vt:include>標簽去包含上面的文件,如下:
A、<vt:template>包含:
我是外部的變量{$:#.var1}。
我是外部的foreach標簽:
<vt:foreach from=”#.names” item=”name” index=”i”>
外部的第{$:#.i}個名字叫{$:#.name}。
< /vt:foreach>
< vt:template id=”inc” file=”inc_content.Html” />
B、<vt:include>包含:
我是外部的變量{$:#.var1}。
我是外部的foreach標簽:
<vt:foreach from=”#.names” item=”name” index=”i”>
外部的第{$:#.i}個名字叫{$:#.name}。
< /vt:foreach>
< vt:include id=”inc” file=”inc_content.Html” />
上面兩塊的VT模版代碼看起來很相似,但是經解析後A中的var1與inc這個<vt:template>模版塊下的變量var1分別獨立存在,互不影響!而B中的變量var1與inc這個<vt:include>的變量var1相等,都是引用同一個變量(其它變量類似)。
現假如A、B兩塊的VT模版代碼都通過過下面的程序來處理:
this.Document.Variables.SetValue("var1", 1);
this.Document.Variables.SetValue("names", new string[] { "張三", "李四", "王五" });
也即是只對外部變量var1、names賦值,最終經模版引擎解析輸出後,它們的輸出結果如下:
從圖可知,<vt:template>包含的沒有數據輸出,而用<vt:include>包含則有數據輸出並且和外部數據一模一樣!所以可把<vt:template>標簽看成是程序語言裡的類,它能擁有它自己的變量,改變外部變量的值不會影響到其內部的同名變量,並且外部標簽可通過其id獲取其內部變量!
具體的示例代碼,請參考:http://net-vtemplate.googlecode.com/svn/src/VTemplate.WebTester/template_include_test.ashx.cs