原文地址:http://www.cnblogs.com/kingthy/archive/2009/08/17/net-vtemplate.html
免费开源的模板引擎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"> |
以上模板代码经过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、变量标识由两部分组成:变量前缀与变量(名)。其中“变量前缀”可以省略,如“#.i”,“#u.i”,“u“
变量前缀:以#号开头后跟模板块的Id值,用于指示此变量是取自于对应Id的模板块下的变量,如#my.user则表示user变量是取自于Id为my的模板块下的变量;如果省略Id 号,即前缀只为#号,则表示是当前模板块下的变量;而如果前缀是“##”,则表示是当前模板块的父模板块(如果不存在父级模板块则为当前模板块)下的变量;如果省略前缀,则表示是文档(根)模板块的变量。
4.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字段/属性值 注:变量表达式可在“变量元素”或“标签元素”的部分属性值中使用。
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 设置拆分数据集合时的组大小,可以为数值常量(如:2)或变量表达式(以$字符开头)。(可不定义)
如果定义此属性值,并且值大于1,则模板引擎在解析此foreach标签时,先将from属性定义的变量表达式的结果值折分成一组组集合数据再进行解析。例如: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 要获取服务器数据的类型,可以为字符串常量或变量表达式(以$字符开头)。值的定义:
类型 说明 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属性(即不存储结果值),默认不输出标签结果值。(可不定义)
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语句) ,可以为字符串常量或变量表达式(以$字符开头) commandtype 数据查询语句的类型。值范围对应于System.Data.CommandType枚举,可以为字符串常量(如:Text)或变量表达式(以$字符开头)。(可不定义)
注:当未定义时默认为CommandType.CommandText值
rowindex 要获取行的行号,可以为数值常量(如:1)或变量表达式(以$字符开头)(可不定义)
注:当此值不定义时将返回一个表结构(DataTable),而如果定义此值,则将返回对应行的数据行(DataRow),如果行不存在则返回nullparameters 数据查询语句中的附加参数的数值/字符串常量或变量表达式(以$字符开头)(可不定义)
注:此属性可以多次定义,在数据查询语句中分别以@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}" />
5.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属性(即不存储结果值),默认不输出标签结果值。(可不定义)
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属性。format 用于格式化变量值的格式,可以为字符串常量或变量表达式(以$字符开头)。(可不定义)
注:在格式表达式中分别以{0},{1}表示各个value属性的变量值output 是否在解析标签时输出标签的结果值true/false,如果定义此属性且值设为true,则可以不定义var属性(即不存储结果值),默认不输出标签结果值。(可不定义)
5.15、<vt:output>数据输出标签元素
此标签可输出某个标签或文件的数据。标签样例:
<vt:output tagid="user" />
<vt:output file="output.html" charset="gb2312" />
标签中已定义的属性列表:
名称 说明 id 标签元素的Id,建议唯一但不强制。(可不定义) name 标签元素的名称。(可不定义) tagid 需要输出数据的其它标签元素Id,可以为字符串常量或变量表达式(以$字符开头)。(可不定义)
注:如果未定义此属性则需要定义file属性file 需要输出数据的文件,可以为绝对路径或相对路径,可以为字符串常量或变量表达式(以$字符开头)。(可不定义)
注:如果未定义此属性则需要定义tagid属性
charset 读取文件时使用的编码,可以为字符串常量或变量表达式(以$字符开头)。(可不定义)
5.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、变量元素
变量元素主要用于输出变量表达式的值。其定义格式为:
{$:变量表达式 属性="属性值"}
例子:
{$: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 | 定义文本在输出时如果被裁剪后要附加显示的文本。(可不定义) |
removehtml | 定义在数据输出时是否将数据里的HTML字符删除。(可不定义) |
call | 在输出变量表达式的值前需要调用的函数名称。(可不定义) 注:此属性可以多次定义,模板引擎将根据定义顺序先后调用函数。函数的原型参考UserDefinedFunction委托 |
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