基本语法

系统所用的模板引擎修改自问沫模板引擎(VMoom.TemplateEngine)。

一、模板调用

<!--#include file="head.tpl" -->
<!-- 这里是网页内容-->
<!--#include file="foot.tpl" -->

二、基本用法

下面,我们来介绍一下用法。我们先来看看一段简单的代码:

Thank You for your order {$order.billFirstNam} {$order.billLastNam}.<br />
Your Order Total is: {$format(order.total, "C")}<br />
<tm:if test="{$order.shipcountry isnot "US"}">
Your order will arrive in 2-3 weeks
<tm:else />
Your order will arrive in 5-7 days
</tm:if>

模板源代码可以包含表达式(expressions)、条件语句(if/elseif/else)、循环语句(foreach/for)等。

1、表达式(模板标签)

表达式是所有封装在类似于“{$...}”的字符串。

示例:{$FirstName}、{$SomeString.Length}

聪明您一定看出来了,它支持直接调用对象的属性和方法。

函数调用:{$trim(somename)}
属性嵌套:{$customer.firstname.length}
对象方法:{$firstname.substring(0, 5)} or {$customer.isValid()}

也可以执行数组访问:

{$SomeArray[3]}
{$Request.Headers["Host"]}

支持一些比较实用的自定义功能函数,列表如下:

equals(obj1, obj2) - 确定两个输入值是否相等。

notequals(obj1, obj2) - 确定两个输入值是否不相等。

iseven(num) - 确定当前处理的标签索引是否是偶数。

isodd(num) - 确定当前处理的标签索引是否是奇数。

isempty(string) - 确定指定值是否为空。

isnotempty(string) - 确定指定值是否不为空。

isnumber(num) - 确定输入值是否为数字。

toupper(string) - 返回输入值的大写副本。

tolower(string) - 返回输入值的小写副本。

isdefined(varname) - 确定输入值是否已经定义。

ifdefined(varname, value) - 如果第一输入值(varname)已经定义,则返回第二输入值(value)。

len(string) - 返回输入值的长度。

tolist(collection, property, delim) - 将输入的集合转换为指定字符分隔的列表。

示例一:

后台初始化:

ArrayList list = new ArrayList();
list.Add("one");
list.Add("two");
list.Add("three");
template.SetValue("mylist", list);

模板代码:

{$toList(mylist, " & ")}

输出结果:

one & two & three

示例二:

后台初始化:

suppose you have list as:list.Add(new Customer("Tom", "Whatever"));
list.Add(new Customer("Henry", "III"));
list.Add(new Customer("Tom", "Jackson"));
template.SetValue("mylist", list);

模板代码:

{$toList(mylist, "firstName", ",")}

输出结果:

Tom,Henry,Tom

isnull(obj) - 确定输入值是否为 null。

not(boolvalue) - 对输入值执行逻辑“非”运算。

iif(booleanExpression, iftruevalue, iffalsevalue) - 对输入值执行条件(三目)运算。

示例:

{$iif(isodd(i), "bgcolor=yellow", "bgcolor=red")}

输出结果:

如果 i 是奇数:bgcolor=yellow
如果 i 是偶数:bgcolor=red

format(object, formatstring) - 为输入值执行格式化。

trim(string) - 从输入值移除数组中指定的所有首部和尾部匹配项。

filter(collection, booleanproperty) - 从输入集合过滤指定内容。

gt(obj1, obj2) - 确认第一输入值是否大于第二输入值。

lt(obj1, obj2) - 确认第一输入值是否小于第二输入值。

compare(obj1, obj2) - 确认第一输入值是否等于第二输入值。

or(bool1, bool2) - 为两个输入值执行逻辑“或”运算。

and(bool1, bool2) - 为两个输入值执行逻辑“与”运算。

comparenocase(string1, string2) - 确定两个输入值是否相等,而忽略大小写。

stripnewlines(string) - 清除空行,并将其转换为一个空格。

typeof(object) - 获取指定实例的 System.Type。

cint(value) - 将输入值转换为 int。

cdouble(value) - 将输入值转换为 double。

cdate(value) - 将输入值转换为 DateTime。

createtypereference(type) - 创建类型引用。

{$createtypereference("System.Math").Round(3.39789)}
{$createtypereference("System.Math").PI}
or
<tm:set name="MyMath" value="{$createtypereference("System.Math")}" />
{$MyMath.Round(3.3)}
{$MyMath.PI}

2、运算符:

is - "="

isnot - "!="

and - "&&"

or - "||"

lt, lte, gt, gte - "<,<=,>,>="

{$varOne lt 3}
{$varTwo lte cdbl(3)}
{$varThree gt varFour and varFive gte 5.0}

3、语句标签:

IF

<tm:if test="{$booleanexpression}">
// ...
<tm:elseif test="{$bool}">
// ...
<tm:else>
// ...
</tm:if>

FOREACH

<tm:foreach collection="{$collection}" item="cust" index="i" to="0">
{$i}: {$cust.lastname}, {$cust.firstname}
</tm:foreach>

FOR

<tm:for from="1" to="10" index="i">
{$i}: {$customers[i].name}
</tm:for>

SET

<tm:set name="var" value="{$someexpression}" />

4、自定义模板:

声明模板的方法:

<tm:template name="ShowCustomer">
{$customer.lastname}, {$customer.firstname}
</tm:template>
<tm:showcustomer customer="{$cust}" />

调用自定义模板(或子模板)则很简单,就是直接使用模板名作为标签名即可:

<tm:showcustomer />
或者:
<tm:showcustomer></tm:showcustomer>

在自定义模板中可以使用 innerText 来调用输入内容(您可以把它理解为类似于 DHTML 中的 innerHTML,这里的 innerText 代表的就是您定义的模板标签所包含的子节点及其所有子节点的内容):

<!-- 声明 -->
<tm:template name="bold">
<b>{$innerText}</b>
</tm:template>
<tm:bold>{$cust.lastname}, {$cust.firstname}</tm:bold>
<!-- 输出 -->
<b>Jackson, Tom</b>

自定义模板(或子模板)支持嵌套:

<tm:template name="italic">{$innerText}</tm:template>
<tm:bold><tm:italic>This will be bold and italic</tm:italic></tm:bold>
top