waemz

玩啊学啊,我的人生.
随笔 - 16, 文章 - 0, 评论 - 2, 引用 - 0
数据加载中……

2008年2月1日

AderTemplate模版引擎使用分析(二)

Ver2.1还添加了以下操作符:
is - 和调用equal方法相同. Ex: #obj1 is obj2# 会返回if obj1 equal obj2
isnot - 和调用notequal方法相同. Ex: #obj1 isnot obj2#
and - 相当于c#中的&&操作符
or - 相当于c#中的||
lt, lte, gt, gte - lt(less than,即c#中的"<"), lte(less than or equal,即c#中的"<="), gt(greater than 即c#中的">") and gte(greater than or equal,c#中的">="). 当使用数字类型操作时,必须是相同的类型.如果希望比较double和int类型,必须将int转换为double类型(使用cdouble函数).
#varOne lt 3#
#varTwo lte cdbl(3)#
#varThree gt varFour and varFive gte 5.0#

Built In Tags(内置标签???):
IF
你可以使用IF根据表达式有条件的输出文本:
<ad:if test="#booleanexpression#">

<ad:elseif test="#bool#">

<ad:else>

</ad:if>
elseif和else是可选的,当if运算返回真的时候,if代码块中包含的代码将被执行(输出);否则执行elseif运算,然后是else.
Ex:
<ad:if test="#cust.country is "CHINA"#">
You are CHINA customer.
<ad:else>
You are from: #cust.country# country.
</ad:if>

如果cust.country是CHINA的话,输出:you are CHINA customer.

FOREACH
你可以使用foreach对集合内的元素进行循环遍历.

<ad:foreach collection="#collection#" var="cust" index="i">
#i#: #cust.lastname#, #cust.firstname#
</ad:foreach>

假设customers是customer的集合:customers = Customer("Tom", "Jackson"), Customer("Mary", "Foo")
输出将是:
1. Jackson, Tom
2. Foo, Mary
在循环处理中,变量名称将被集合中的元素替换.foreach中的index属性可以省略,它被用来在循环中表示循环标志.开始于1并在每次迭代中自动增加.

FOR
你可以通过一个整数标志来进行FOR循环:

<ad:for from="1" to="10" index="i">
#i#: #customers[i].name#
</ad:for>

SET
Set标签允许设值通过其他表达式:
<ad:set name="var" value="#someexpression#" />
当Set语句执行后,你可以象使用局部变量一样使用var.当存取复杂类型的对象的时候非常有用.
以下写法:
#customers[i].address.firstname#
#customers[i].address.lastname#
#customers[i].address.address1#
可以写成: 
<ad:set name="add" value="#customers[i].address#" />
#add.firstname# 
#add.lastname# 
#add.address1#

Custom Templates(定制模版):
你可以在模版文件中创建自己可调用的的模版.使用Template标签来做:

<ad:template name="ShowCustomer">
#customer.lastname#, #customer.firstname# 
</ad:template>

<ad:showcustomer customer="#cust#" />

你可以为自定义的模版添加任何属性,然后就可以在模版中使用他们.自定义模版也可以使用在它之外定义的任何变量,当调用自定义模版的时候必须在最后加上/或者加关闭标签
Ex:
<ad:showcustomer />
OR
<ad:showcustomer></ad:showcustomer>

Ex:

<ad:template name="bold">
<b>#innerText#</b>
</ad:template>

<ad:bold>#cust.lastname#, #cust.firstname#</ad:bold>

输出: <b>Jackson, Tom</b> (if customer is Tom Jackson)
模版可以嵌套使用:

<ad:template name="italic">#innerText#</ad:template>

<ad:bold><ad:italic>This will be bold and italic</ad:italic></ad:bold>

模版可以嵌套定义:

<ad:template name="doit">
    
<ad:template name="colorme">
    
<font color=#color#>#innerText#</font>
    
</ad:template>
    
<ad:colorme color="blue">colorize me</ad:colorme>
</ad:template>
嵌套定义的模版只能在按照定义顺序在父模版中使用.
也可以在程序中定义模版:
TemplateManager mngr = ;
mngr.AddTemplate(Template.FromString(
"bold""<b>#innerText#</b>"));
现在bold模版可以在以后使用了.

(未完,等续)

AderTemplate官方网站:http://www.adersoftware.com
AderTemplate dll下载地址:http://www.aspxon.com/ShowSoft/15.aspx
AderTemplate源码下载地址(含有演示):AderTemplate(dll)模版引擎(c#源码)

posted @ 2008-02-01 16:02 waemz 阅读(127) | 评论 (0)编辑

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 阅读(211) | 评论 (0)编辑

2007年6月14日

ASP.NET纯代码实现伪静态地址(URL重写)

     摘要: 本人才疏学浅,具体实现原理不敢多说,仅仅写出使用方法,供大家参考.  阅读全文

posted @ 2007-06-14 15:38 waemz 阅读(573) | 评论 (0)编辑

2007年5月13日

深入浅出工厂模式

     摘要: 话说十年前,有一个暴发户,他家有三辆汽车——Benz奔驰、Bmw宝马、Audi奥迪,还雇了司机为他开车。不过,暴发户坐车时总是怪怪的:上Benz车后跟司机说“开奔驰车!”,坐上Bmw后他说“开宝马车!”,坐上Audi说“开奥迪车!”。你一定说:这人有病!直接说开车不就行了?!  阅读全文

posted @ 2007-05-13 01:34 waemz 阅读(87) | 评论 (0)编辑

2007年5月11日

在Web应用程序中执行计划任务(多线程)

     摘要: 在业务复杂的应用程序中,有时候会要求一个或者多个任务在一定的时间或者一定的时间间隔内计划进行,比如定时备份或同步数据库,定时发送电子邮件等,我们称之为计划任务。实现计划任务的方法也有很多,可以采用SQLAgent执行存储过程来实现,也可以采用Windows任务调度程序来实现,也可以使用Windows服务来完成我们的计划任务,这些方法都是很好的解决方案。但是,对于Web应用程序来说,这些方法实现起来并不是很简单的,主机服务提供商或者不能直接提供这样的服务,或者需要你支付许多额外的费用。 本文就介绍一个直接在Web应用程序中使用的简单的方法,这个方法不需要任何额外的配置即可轻松实现。  阅读全文

posted @ 2007-05-11 16:40 waemz 阅读(90) | 评论 (0)编辑

2007年4月24日

您未必知道的Js技巧

     摘要: 1. document.GetElementsByTagName可以获得某一个标签的所有元素,可以通过document.getElementsByTagName(‘*’)获得页面上的所有元素,这里星号代表任何标签,而注释标签的tagName是”!”  阅读全文

posted @ 2007-04-24 01:11 waemz 阅读(100) | 评论 (0)编辑

用 JSON 处理缓存

     摘要: 数据验证是每个企业 Web 应用程序中最富于挑战性、日新月异的部分。通常验证元数据会使 JavaScript 模块中混入服务器端代码。在本文中,您将了解如何在服务器代码的帮助下将元数据缓存在客户端的优秀方法,服务器代码将提供 JSON(JavaScript Object Notation)形式的字符串化元数据。这种方法还允许以类似 Ajax 的方式来处理多值和多组属性。  阅读全文

posted @ 2007-04-24 00:45 waemz 阅读(123) | 评论 (0)编辑

C#.NET分别以GET和POST方式抓取远程页面

     摘要: 最近在写一个抓取程序,刚开始只能用GET方式,找半天才找到POST方式,还准备把多线程也加进来,思考中.  阅读全文

posted @ 2007-04-24 00:19 waemz 阅读(293) | 评论 (1)编辑

2007年4月23日

在 ASP.NET 中执行 URL 重写

     摘要: 介绍如何使用 Microsoft ASP.NET 执行动态 URL 重写。URL 重写是截取传入 Web 请求并自动将请求重定向到其他 URL 的过程。讨论实现 URL 重写的各种技术,并介绍执行 URL 重写的一些实际情况。  阅读全文

posted @ 2007-04-23 23:49 waemz 阅读(58) | 评论 (0)编辑

C#的多线程(2)——机制探索

     摘要: 注:本文中出现的代码均在.net Framework RC3环境中运行通过   一.多线程的概念   Windows是一个多任务的系统,如果你使用的是windows 2000及 其以上版本,你可以通过任务管理器查看当前系统运行的程序和进程。什么是进程呢?当一个程序开始运行时,它就是一个进程,进程所指包括运行中的程序和程序 所使用到的内存和系统资源。而一个进程又是由多个线程所组成的,线程是程序中的一...  阅读全文

posted @ 2007-04-23 23:45 waemz 阅读(173) | 评论 (0)编辑