基于.NET的免费开源的模板引擎-

孤人 提交于 2020-11-29 23:44:15

1、VTemplate模板引擎的简介

VTemplate模板引擎也简称为VT,是基于.NET的模板引擎,它允许任何人使用简单的类似HTML语法的模板语言来引用.NET里定义的对象。当 VTemplate应用于web开发时,界面设计人员可以和程序开发人员同步开发一个遵循MVC架构的web站点,也就是说,页面设计人员可以只关注页面 的显示效果,而由程序开发人员关注业务逻辑编码。VTemplate将.NET程序代码从web页面中分离出来,这样为web站点的长期维护提供了便利, 同时也为我们在ASP.NET WebForm开发之外又提供了一种可选的方案。 VTemplate也可以作为动态文本生成工具,生成HTML、XML、邮件、程序源代码或其它文本等。

 

 

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是存在于对象的字段、属性还是集合项里。

 


3、VTemplate模板范例

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title> test1 </title>
</head>
<body>
<vt:for from="1" to="9" index="i">
<vt:for from="1" to="$i" index="j">
<vt:expression var="r" args="$i" args="$j" expression="{0}*{1}" />{$:i}*{$:j}={$:r}&nbsp;&nbsp;&nbsp;&nbsp;
</vt:for>
<br />
</vt:for>
</body>
</html>

以上模板代码经过VTemplate解析运行后将输出一个99乘法表,如下:

1*1=1    
2*1=2     2*2=4    
3*1=3     3*2=6     3*3=9    
4*1=4     4*2=8     4*3=12     4*4=16    
5*1=5     5*2=10     5*3=15     5*4=20     5*5=25    
6*1=6     6*2=12     6*3=18     6*4=24     6*5=30     6*6=36    
7*1=7     7*2=14     7*3=21     7*4=28     7*5=35     7*6=42     7*7=49    
8*1=8     8*2=16     8*3=24     8*4=32     8*5=40     8*6=48     8*7=56     8*8=64    
9*1=9     9*2=18     9*3=27     9*4=36     9*5=45     9*6=54     9*7=63     9*8=72     9*9=81   

而程序处理代码则只有简单的两行,如下:
注:假设上面的模板代码存放在test1.html文件上

TemplateDocument document = new TemplateDocument(Server.MapPath("template/test1.html"), Encoding.UTF8);
document.Render(Response.Output);

 

 

4、什么是VT模板元素?

VT模板元素VTemplate模板引擎定义的有特殊作用的模板语言元素,分为标签元素变量元素

4.1、标签元素都是程序逻辑控制元素,是标准的HTML标签元素,如上例中用于循环处理的<vt:for>标签和用于计算表达式值的<vt:expression>标签等

4.2、变量元素是数据输出元素,其格式是以“{$:”字符开头,以“}”字符结束。 如上例中的{$:i}、{$:j}和{$:r}等

注:3.7版本后,变量元素的定义可以取消“:”号,即以“{$”字符开头,如{$i}、{$j}与上面的定义不同,但都是一样输出变量的值。

5、变量、变量标识、变量表达式

5.1、变量是VTemplate模板引擎中的核心元素,用于存储或控制数据的输出,其类似于程序语言中的“变量”概念,定义格式也是一样。如上例中的i,j,r变量。

5.2、变量标识由两部分组成:变量前缀与变量(名)。其中“变量前缀”可以省略,如“#.i”,“#u.i”,“u“

        变量前缀:以#号开头后跟模板块的 Id值,用于指示此变量是取自于对应Id的模板块下的变量,如#my.user则表示user变量是取自于Id为my的模板块下的变量;如果省略Id 号,即前缀只为#号,则表示是当前模板块下的变量;而如果前缀是“##”,则表示是当前模板块的父模板块(如果不存在父级模板块则为当前模板块)下的变 量;如果省略前缀,则表示是文档(根)模板块的变量

5.3、变量表达式则是定义获取变量中某个字段、属性或函数方法结果值。

定义格式为:“变量标识.变量字段/属性/函数方法/索引值”。

变量字段/属性/函数方法/索引值:表示要从变量中取得数据的字段/属性/函数方法/索引值(数字),其中函数方法只支持不带参数的方法。此段可以定义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字段/属性值

注:变量表达式可在“变量元素”或“标签元素”的部分属性值中使用。

6、标签元素

6.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特性。(可不定义)

 

6.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 模板块数据文件的编码,如果未定义此属性则如果存在父级模板块的话则采用父级模板块的编码,否则采用系统默认编码

 

6.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实例。(可不定义)

6.4、<vt:foreach>集合数据循环标签元素

此标签用于定义处理集合数据的循环,类似于程序语言中的foreach循环。

标签样例:

<vt:foreach from="users" item="user" index="i">…………………………</vt:foreach>

标签中已定义的属性列表:

名称 说明
id 标签元素的Id,建议唯一但不强制。(可不定义)
name 标签元素的名称。(可不定义)
from 变量表达式
item 定义存储当前循环值的变量标识(可不定义)
index 定义存储循环索引值的变量标识,注:此索引值是一个LoopIndex实例。(可不定义)
groupsize

设置拆分数据集合时的组大小,可以为数值常量(如:2)或变量表达式(以$字符开头)。(可不定义)
如果定义此属性值,并且值大于1,则模板引擎在解析此foreach标签时,先将from属性定义的变量表达式的结果值折分成一组组集合数据再进行解析。

例如:from的变量表达式的结果值原是“1,2,3,4,5,6”数组集合,如果groupsize设置为2,则将会拆成"[1,2],[3,4],[5,6]"的数据集合,再用此新的数据集合进行循环解析。

 

6.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 标签元素的名称。(可不定义)

6.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属性的变量表达式的值。(可不定义)

6.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属性的变量表达式的值。(可不定义)

6.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 标签元素的名称。(可不定义)

 

6.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属性(即不存储结果值),默认不输出标签结果值。(可不定义)

 

6.10、<vt:serverdata>服务器数据标签元素

此标签用于获取服务器的部分数据,如Session、Application、DateTime等等

标签样例:

<vt:serverdata var="session" type="session" item="username" />

 

标签中已定义的属性列表:


名称 说明
id 标签元素的Id,建议唯一但不强制。(可不定义)
name 标签元素的名称。(可不定义)
var 存储服务器数据的变量标识
type

要获取服务器数据的类型,可以为字符串常量或变量表达式(以$字符开头)。值的定义:


类型 说明
Time

获取服务器时间

item 属性值可定义为以下值:

today = 获取今天的日期(不带时间部分)

yesterday = 获取昨天的日期(不带时间部分)

tomorrow = 获取明天的日期(不带时间部分)

其它值 = 获取服务器现在的时间

Random

获取一个0---1之间的双精度随机数

item 属性不需要定义

Application

获取服务器当前上下文的HttpApplicationState对象.如果模板引擎不在Web程序上使用则无效

item 属性值则为Application集合的键值key

Session

获取服务器当前上下文的HttpSessionState对象.如果模板引擎不在Web程序上使用则无效

item 属性值则为Session集合的键值key

Cache

获取服务器当前上下文的缓存对象

item 属性值则为Cache集合的键值key

QueryString

获取服务器当前上下文的Request.QueryString数据集合.如果模板引擎不在Web程序上使用则无效

item 属性值则为Request.QueryString集合的键值key

Form 获取服务器当前上下文的Request.Form数据集合.如果模板引擎不在Web程序上使用则无效

item 属性值则为Request.Form集合的键值key

Cookie

获取服务器当前上下文的Request.Cookie数据集合.如果模板引擎不在Web程序上使用则无效 

item 属性值则为Request.Cookie集合的键值key,如果item值包含“.”号,则表示属于某个Cookie下的某个Value值,例如:

item="user"则表示是Request.Cookie["user"]值;
item="user.name"则表示是Requst.Cookie["user"]["name"]值

ServerVariables 获取服务器当前上下文的Request.ServerVariables数据集合.如果模板引擎不在Web程序上使用则无效

item 属性值则为Request.ServerVariables集合的键值key

RequestParams 获取服务器当前上下文的Request.Params数据集合.如果模板引擎不在Web程序上使用则无效

item 属性值则为Request.Params集合的键值key

Request 获取服务器当前上下文的HttpRequest对象.如果模板引擎不在Web程序上使用则无效

item 属性不需要定义

Environment 获取服务器系统平台的环境参数

item 属性不需要定义

AppSetting 获取当前应用程序配置文件里的AppSettings配置参数

item 属性值则为ConfigurationManager.AppSettings集合的键值key

item 要获取的数据项,此属性值根据type值而具有不同的意义,具体的看上表,可以为字符串常量或变量表达式(以$字符开头)。
output 是否在解析标签时输出标签的结果值true/false,如果定义此属性且值设为true,则可以不定义var属性(即不存储结果值),默认不输出标签结果值。(可不定义)

 

  

6.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语句) ,可以为字符串常量或变量表达式(以$字符开头)
commandtype

数据查询语句的类型。值范围对应于System.Data.CommandType枚举,可以为字符串常量(如:Text)或变量表达式(以$字符开头)。(可不定义)

注:当未定义时默认为CommandType.CommandText值

rowindex 要获取行的行号,可以为数值常量(如:1)或变量表达式(以$字符开头)(可不定义)
注:当此值不定义时将返回一个表结构(DataTable),而如果定义此值,则将返回对应行的数据行(DataRow),如果行不存在则返回null
parameters

数据查询语句中的附加参数的数值/字符串常量或变量表达式(以$字符开头)(可不定义)
注:此属性可以多次定义,在数据查询语句中分别以@p0,@p1表示各个parameters属性的变量表达式值

例子:
<vt:datareader var="members" connection="db" commandtext="select * from [member] where id>=@p0 and sex=@p1" parameters="id" parameters="sex" />

ParameterFormat

数据查询参数的格式,可以为字符串常量或变量表达式(以$字符开头),默认为"@p{0}",其中"{0}"是占位符,表示各查询参数的索引数字(也即是parameters属性的先后顺序)。(可不定义)

注:如果定义此属性则commandtext里的语句也必须相应更改。

例子:
<vt:datareader var="members" connection="db" commandtext="select * from [member] where id>=&par0 and sex=&par1" parameters="id" parameters="sex" parameterformat="&par{0}" />

 

 

 

 

6.12、<vt:function>函数调用标签元素

此标签用于直接调用函数标签样例:

<vt:function var="days" method="DaysInMonth" type="System.DateTime" args="2009" args="10" />
<vt:function var="UTCTime" method="ToUniversalTime" type="$time" />

  
标签中已定义的属性列表:


名称 说明
id 标签元素的Id,建议唯一但不强制。(可不定义)
name 标签元素的名称。(可不定义)
var 存储函数返回值的变量标识
method

函数方法名,可以为字符串常量或变量表达式(以$字符开头)

type 包含静态函数方法的类型或包含函数方法的类型,可以为字符串常量或变量表达式(必须以$字符开头,如:$i) (可不定义)
注:当未定义此属性时,将从模板块里获取注册的“用户自定义函数”,函数的原型参考UserDefinedFunction委托
args

参与函数运算的参数,可为数值/字符串常量或变量表达式(必须以$字符开头,如:$i) (可不定义)
注:此属性可以多次定义,但其定义顺序必须与函数方法的参数顺序一致。

output 是否在解析标签时输出标签的结果值true/false,如果定义此属性且值设为true,则可以不定义var属性(即不存储结果值),默认不输出标签结果值。(可不定义)

 

 

6.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属性(即不存储结果值),默认不输出标签结果值。(可不定义)

 

 

6.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属性。

format 用于格式化变量值的格式,可以为字符串常量或变量表达式(以$字符开头)。(可不定义)
注:在格式表达式中分别以{0},{1}表示各个value属性的变量值
output 是否在解析标签时输出标签的结果值true/false,如果定义此属性且值设为true,则可以不定义var属性(即不存储结果值),默认不输出标签结果值。(可不定义)

 

 

6.15、<vt:output>数据输出标签元素

此标签可输出某个标签或文件的数据标签样例:

<vt:output tagid="user" />
<vt:output file="output.html" charset="gb2312" />

  
标签中已定义的属性列表:


名称 说明
id 标签元素的Id,建议唯一但不强制。(可不定义)
name 标签元素的名称。(可不定义)
tagid 需要输出数据的其它标签元素Id,可以为字符串常量或变量表达式(以$字符开头)。(可不定义)
注:如果未定义此属性则需要定义file属性
file

需要输出数据的文件,可以为绝对路径或相对路径,可以为字符串常量或变量表达式(以$字符开头)。(可不定义)

注:如果未定义此属性则需要定义tagid属性

charset 读取文件时使用的编码,可以为字符串常量或变量表达式(以$字符开头)。(可不定义)

 

 

 

6.16、<vt:import>类型导入标签元素

此标签可导入某个类型。标签样例:

<vt:import var="math" type="System.Math" />

<vt:import var="utils" type="Kingthy.Utils" assembly="c:\dll\kingthy.utils.dll"  />
  
标签中已定义的属性列表:


名称 说明
id 标签元素的Id,建议唯一但不强制。(可不定义)
name 标签元素的名称。(可不定义)
var 用于保存类型的变量标识
type

需要导入的类型,可以为字符串常量或变量表达式(以$字符开头)

assembly 需要导入的类型所在的程序集,可以为字符串常量或变量表达式(以$字符开头),值可以定义为某个程序集文件或程序集名称。(可不定义)

 

 

 

 

 

 

6.17、<vt:panel>数据面板标签元素

此标签可方便用于实现“母版页”(MasterPage)的功能。标签样例:

定义容器面板:

<vt:panel id="header" />

 

定义内容数据面板,此内容标签里的数据将在对应的容器面板里输出。

<vt:panel container="header">

这是头部内容

</vt:panel >

 

上面定义的标签的数据将会在id="header"里的panel标签里输出。

标签中已定义的属性列表:


名称 说明
id 标签元素的Id,建议唯一但不强制。如果定义了此id则表示此面板标签可以做为一个容器面板使用(可不定义)
name 标签元素的名称。(可不定义)
container 定义输出容器面板的id。如果定义此属性则表示此面板数据只在容器面板里输出。(可不定义)

 

注意:此标签必须定义id或者container之一属性,或者全都定义

 

 

 

 

7、变量元素

变量元素主要用于输出变量表达式的值。其定义格式为:

{$:变量表达式 属性="属性值"}

或3.7版本以上可以这样定义(建议)

 {$变量表达式 属性="属性值"}

 

例子:

{$: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字符编码,再将“空格”转换为"&nbsp;”;“回车换行”转换为"<br />”字符)。true/false,默认为false(可不定义)
jsencode 输出变量表达式的值时是否需要进行Javascript脚本字符编码。true/false,默认为false(可不定义)
format 用于格式化变量表达式的值的格式(如果变量表达的值已实现IFormattable接口则调用接口方法,否则调用String.Format方法)。(可不定义)
length 输出变量表达的值时的最大长度。如果值的字符长度超出此定义的值,则将进行字符截取。默认为0不截取(可不定义)
charset 定义在进行urlencode或length截取字符时采用的编码。默认为所在模板块的charset(可不定义)
appendtext

定义文本在输出时如果被裁剪后要附加显示的文本。(可不定义)
注: 此属性必须和length属性配合使用。

removehtml 定义在数据输出时是否将数据里的HTML字符删除。(可不定义)
call 在输出变量表达式的值前需要调用的函数名称。(可不定义)
注:此属性可以多次定义,模板引擎将根据定义顺序先后调用函数。函数的原型参考UserDefinedFunction委托

 

8、注释标签:

     注:注释标签只在2.1以上版本有效

     格式:<!--vt[注释文字]-->

     注释标签在解析输出时不会被输出显示,并且注释里面可以书写任何的标签元素,都不会被VTemplate模板引擎解析。

     例子:

     <!--vt[这是VT的注释代码,下面的标签不会被解析到<vt:serverdata type="time" output="true" />。]-->

 

9、项目托管
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/


1、VTemplate模板引擎的元素对象:

让我们看一下VTemplate模板引擎中的所有元素对象关系图:

vtemplate_cd

从关系图可看出,VTemplate模板引擎的元素对象主要由三种基对象构成:TextNodeVariableTag、Tag

 

1.1、TextNode元素对象:

TextNode即是文本节点,也即是对模板引擎来说无任何意义的文本字符。

上一篇中的这段VT模板:

<div class=”bloglog”><strong>{$:blogarchive.title htmlencode=”true”}</strong>

当被模板引擎解析后,前后暗红色区域的段字符将被解析为两个不同的TextNode对象。

1.2、VariableTag元素对象:

VariableTag变量元素对象,主要用于输出变量表达式的值。如上例中的VT模板,被解析后将红色段字符将被解析为一个VariableTag对象。

1.3、Tag元素对象:

Tag标签元素对象,此类对象可供我们的程序获取调用,所以一般用于做程序逻辑控制。其根据不同的用途衍生出不同的标签元素对象,如条件判断的IfTag、数据循环的ForEachTagForTag对象等等。

方法:

名称 说明
GetChildTagById(string id) 根据标签id获取某个子Tag对象
GetChildTagsByName(string name) 获取所有同名称的子Tag对象
GetChildTagsByTagName(string tagName) 获取所有同标签名(如<vt:for>中的for则叫标签名)的子Tag对象
Render(TextWriter writer) 将本标签元素对象的最终呈现数据文本解析到TextWriter对象
RenderTo(string filename)
RenderTo(string filename, Encoding charset)
将本标签元素对象的最终呈现数据文本解析到某个文件保存


部分属性/集合

名称 说明
Attributes 返回标签对象中定义的属性集合
InnerElements 返回标签对象中的子元素对象集合

 

事件:

名称 说明
BeforeRender 在准备呈现本标签元素对象的解析数据文本前触发的事件
AfterRender 在已呈现本标签元素对象的解析数据文本后触发的事件

 

1.3.1 TemplateDocument对象:

TemplateDocument对象是VTemplate模板引擎的入口。当根据VT模板实例化TemplateDocument对象后,在程序里我们就可以通过TemplateDocument对象提供的方法或属性/集合来访问VT模板在内存中表现的各个模板元素对象。

方法:

名称 说明
GetChildTemplateById(string id) 根据标签id获取某个子Template对象
GetChildTemplatesByName(string name) 获取所有同名称的子Template对象
GetRenderText() 获取解析后最终呈现的数据文本
SetValue(string varName,obj varValue) 设置所有同名变量的值
FromFileCache(string fileName, Encoding charset) 从文件中构建缓存模板文档对象

 

部分属性/集合:

名称 说明
DocumentElement 返回文档(根)模板对象
Variables 返回当前模板块下的变量集合
ChildTemplates 返回当前模板块下的子Template对象集合

 

2、Variable :变量

变量是VTemplate模板引擎中的核心,用于存储或控制数据的输出,其类似于程序语言中的“变量”概念,定义格式也是一样。其在VT模板中是寄生于VariableTag元素对象或者Tag元素对象中的属性值中。

VariableTag元素对象中定义:

<div class=”bloglog”><strong>{$:blogarchive.title htmlencode=”true”}</strong>

或在Tag元素对象属性中定义:

<vt:foreach from=”blogarchive.comments” item=”comment” index=”floor”>………</vt:foreach>

当上面的VT模板被解析后,蓝色的字符将会解析为Variable。在程序代码中就可以通过TemplateDocumentTemplate标签元素对象的Variables集合访问变量。

 

方法:

名称 说明
SetExpValue(string exp, object value) 设置变量中某种表达式所表示的值
Reset() 重设(清空)当前变量中已缓存的表达式值


部分属性:

名称 说明
Value 设置或返回当前变量的值

 

3、Attribute : 属性

Tag元素对象中定义的某个属性,当定义后可通过对应Tag元素对象的Attributes集合访问。

<vt:foreach from=”blogarchive.comments” item=”comment” index=”floor”>………</vt:foreach>

如上面VT模板被解析后foreach元素对象将含有3个属性。

注:Tag元素对象的属性不限制个数,但在某些Tag元素对象中某些属性是已被VT模板引擎定义使用的!

 

4、LoopIndex :循环索引

循环索引只在<vt:foreach>和<vt:for> Tag元素对象中index属性值中使用,或者换句话说,<vt:foreach>和<vt:for>标签中index属性定义的变量的值存储的是一个循环索引对象。


部分属性:

名称 说明
Value 返回当前索引值
IsFirst 返回当前索引值是不是第一个
IsLast 返回当前索引值是不是最后一个
IsEven 返回当前索引值是不是偶数值

 

上篇中我们实现了一个博客评论列表,那段VT模板如下:

<strong>评论列表</strong>
<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>

如果现在我们想实现当楼层为偶数时换一种风格显示(比如加背景色),那么我们就可以根据floor变量的值来进行修改VT模板了,如下:

<strong>评论列表</strong>
<vt:foreach from=”$blogarchive.comments” item=”#.comment” index=”#.floor”>
<hr class=”blogsplit”/>
<vt:if var=”#.floor.iseven” value=”true”>
<div class=”blogcomment evenfloor”>#{$:#.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:else />
<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:if>
</vt:foreach>

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!