AderTemplate模版引擎使用分析

AderTemplate只能运行于.NET2.0之上.
这里有一个简单例子:
Thank You for your order #order.billFirstName# #order.billLastName#.
<br>
Your Order Total is: #format(order.total, "C")#
<br>
<ad:if test="#order.shipcountry isnot "US"#">
Your order will arrive in 2-3 weeks
<ad:else>
Your order will arrive in 5-7 days
</ad:if>
模版文件可以含有表达式,if/elseif/else语句,foreach/for/set语句和其他模版文件.

Templates API:在模版引擎中有两个主要的类:
Template和TemplateManager.
Template含有一个简单的模版文件实例,TemplateManager被用来处理模版.

创建模版对象Template实例的方法是通过Template或者TemplateManager的静态方法:
Template template = Template.FromString(string name, string data)
Template template 
= Template.FromFile(string name, string filename)
然后可以用它来实例化TemplateManager:
TemplateManager mngr = new TemplateManager(template);

或者可以这么做:
TemplateManager mngr = TemplateManager.FromFile(filename);
TemplateManager mngr 
= TemplateManager.FromString(template);
使用FromString方法,参数string template可以包含模版代码.这个方法可以在没有模版文件的情况下,从动态生成的文本创建TemplateManager.

可以使用SetValue(string name, object value);来处理模版文件中的标签.
Ex:
mngr.SetValue("customer"new Customer("Tom""Jackson"));
这样就可以在模版中使用customer标签,你可以使用任何类型的对象来替换标签,当变量的值被output的时候,ToString()方法会被调用.

- Expressions 表达式(标签,应该这么理解把)
在模版文件中标签是以#包起来的字符串:
#FirstName#

这个例子会输出first name的值.如果要输出#,只要连写两个#即可.
Ex:
Your SS## is #ssnumber#

使用标签你可以输出任何变量(对象):
#somevar#
输出对象的一个属性或字段:
#somestring.Length#
属性名称不区分大小写,所以你可以:#string.length# or #string.LENGTH#
或者调用一个函数:#trim(somename)#
#customer.firstname.length#
你可以调用任何对象的方法:
#firstname.substring(0, 5)# 或者 #customer.isValid()#

Ver2.1允许你调用指定下标的Array项:
#somearray[3]# - 得到Array的第三项
#hastable["somekey"]# - 得到somekey的值从hashtable.

有一些现成的函数和很方便就能添加的函数,这些函数是:
equals(obj1, obj2) - 检查obj1和obj2是否相等,返回boolean真假
notequals(obj1, obj2) - 返回!equals(obj1, obj2). 相当于调用: not(equals(obj1, obj2))
iseven(num) - tests whether number is an even number
isodd(num) - tests whether number is an odd number
isempty(string) - 测试字符串是否为空. 和equals(string.Length, 0)相同
isnotempty(string) - 测试字符串是否含有至少1个字符
isnumber(num) - 测试num是否为数字格式
toupper(string) - 不说了
tolower(string) - 不说了
isdefined(varname) -  测试varname是否被定义
ifdefined(varname, value) - 如果varname被定义,那么返回value的值.例如:#ifdefined("name", name)# -如果name被定义的话,返回name的值,否则返回nothing.
len(string) - 返回字符串的长度.
tolist(collection, property, delim) -以delim为分隔符,把collection转化为字符串.prototype是collection的某个属性,如果prototype不为空,将返回以delim分隔的该属性的值.如果没有prototype,collection将被使用.
Ex:
假设list如下:
ArrayList list = new ArrayList();
    list.Add(
"one");
    list.Add(
"two");
    list.Add(
"three");
    template.SetValue(
"mylist", list);
那可以在模版中这样写:#toList(mylist, " & ")#
最后的输出将是:one & two & three

假设list如下:
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) - 和c#中的三元表达式一样: booleanExpression ? iftruevalue : iffalsevalue
Ex:
#iif(isodd(i), "bgcolor=yellow", "bgcolor=red")#
will output bgcolor=yellow if i is odd number and bgcolor=red if i is not odd number

format(object, formatstring) - 将会调用object的ToString(formatstring).
Ex:
(如果total是货币型1208.45)
#format(total, "C")#
会输出: $1,208.45
trim(string) - 略
filter(collection, booleanproperty) - will return new List from collection for those objects whose booleanproperty property evaluates to true

gt(obj1, obj2) - 如果obj1>obj2返回true.obj1和obj2必须继承于相同的类型.
lt(obj1, obj2) - 如果obj1<obj2返回true.obj1和obj2必须继承于相同的类型.
compare(obj1, obj2) - 如果obj1<obj2,返回-1;如果obj1==obj2,返回0,如果obj1>obj2返回1.obj1和obj2必须继承于相同的类型.
or(bool1, bool2) - 如果bool1为真或bool2为真,返回真
ex:
#or(equals(state, "IL"), equals(state, "NY"))# - 如果state=="IL"或者state=="NY"返回真
and(bool1, bool2) - 不罗嗦了
comparenocase(string1, string2) - will do case insenstive comparison of string1 and string2 and return true if they are equal
stripnewlines(string) - 在string后换行
typeof(object) - Ex: typeof("hello") return "string". typeof(3) returns int
cint(value) - 调用Convert.ToInt32 from .net library
cdouble(value) - 转换为double类型
cdate(value) - 转换为datetime类型.Ex: #cdate("2005-5-1")#
createtypereference(type) - Ex:
#createtypereference("System.Math").Round(3.39789)#
#createtypereference("System.Math").PI#
or
<ad:set name="MyMath" value="#createtypereference("System.Math")#" />
#MyMath.Round(3.3)#
#MyMath.PI#

(未完,等续)

AderTemplate官方网站:http://www.adersoftware.com
AderTemplate dll下载地址:http://www.aspxon.com/ShowSoft/15.aspx
AderTemplate源码下载地址(含有演示):AderTemplate(dll)模版引擎(c#源码)
posted @ 2008-02-01 12:16  waemz  阅读(1463)  评论(0编辑  收藏  举报