[模板]免费开源的模版引擎VTemplate

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">
<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);

 

 

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属性/字段值

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

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

 

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 要进行运算的表达式。

 

5.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

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

item 属性不需要定义

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

item 属性不需要定义

item 要获取的数据项,此属性值根据type值而具有不同的意义,具体的看上表。

 

 

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

 

7、项目托管
VTemplate项目托管在Google code上。
SVN: http://net-vtemplate.googlecode.com/svn/src/VTemplate.Engine/

 例子请参考VTemplate.WebTester项目

 http://net-vtemplate.googlecode.com/svn/src/VTemplate.WebTester/

赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏