MonoRail学习笔记十三:NVelocity的增强功能

之前我转载过一篇:《Velocity 模板使用指南》中文版[转] ,这个是基于最开始的Java版下的Velocity来说的。后来在castle的.NET版下又提供了一些增强功能,详见:NVelocity Improvements
本文结合一些小例子来具体谈谈这些增强功能的使用。
(有部分内容是直接翻译自NVelocity Improvements -_-)

一、支持数组参数
比如在Controller中定义如下方法:
MonoRail学习笔记十三:NVelocity的增强功能        public void Index()
MonoRail学习笔记十三:NVelocity的增强功能        
{
MonoRail学习笔记十三:NVelocity的增强功能            PropertyBag.Add(
"instance"this);
MonoRail学习笔记十三:NVelocity的增强功能        }

MonoRail学习笔记十三:NVelocity的增强功能        
public static string Welcome(params String[] args)
MonoRail学习笔记十三:NVelocity的增强功能        
{
MonoRail学习笔记十三:NVelocity的增强功能            
return String.Join("-", args);
MonoRail学习笔记十三:NVelocity的增强功能        }
在vm中写:
MonoRail学习笔记十三:NVelocity的增强功能$instance.Welcome('arg1''arg2')
那么回输出如下结果:
arg1-arg2

二、内置字典支持
对于一些传参的地方很方便,比如我们常用的一种方式:
MonoRail学习笔记十三:NVelocity的增强功能$HtmlHelper.LabelFor('elementid''Name:'"%{class='required', accessKey='N'}")
那么会自动生成一个字典,里面包含class和accessKey两个条目

内置字典我们可以在很多场合用到,比如我们在Controller中定义一个方法:
MonoRail学习笔记十三:NVelocity的增强功能        public string DictionaryTest(string name, IDictionary attributes)
MonoRail学习笔记十三:NVelocity的增强功能        
{
MonoRail学习笔记十三:NVelocity的增强功能            StringBuilder sResult 
= new StringBuilder("<input type=\"text\" name='" + name + "'");
MonoRail学习笔记十三:NVelocity的增强功能            
foreach (object key in attributes.Keys)
MonoRail学习笔记十三:NVelocity的增强功能            
{
MonoRail学习笔记十三:NVelocity的增强功能                
object value = attributes[key];
MonoRail学习笔记十三:NVelocity的增强功能                sResult.Append(
" " + key + "='" + value + "");
MonoRail学习笔记十三:NVelocity的增强功能            }

MonoRail学习笔记十三:NVelocity的增强功能
MonoRail学习笔记十三:NVelocity的增强功能            sResult.Append(
"/>");
MonoRail学习笔记十三:NVelocity的增强功能
MonoRail学习笔记十三:NVelocity的增强功能            
return sResult.ToString();
MonoRail学习笔记十三:NVelocity的增强功能        }

然后在vm中调用:
MonoRail学习笔记十三:NVelocity的增强功能$instance.DictionaryTest('id', "%{aa='aa1', value='aa2', value2='aa3'}")
MonoRail学习笔记十三:NVelocity的增强功能
会在页面中生成一个输入框,具体的html代码是:
MonoRail学习笔记十三:NVelocity的增强功能<input type="text" name='id' aa='aa1'  value='aa2'  value2='aa3' />

三、更强的foreach功能(这个功能比较好)
可以指定在foreach之前、之后等特定时候执行一些语句,具体语法如下:
MonoRail学习笔记十三:NVelocity的增强功能#foreach($i in $items)
MonoRail学习笔记十三:NVelocity的增强功能#each (this is optional since its the default section)
MonoRail学习笔记十三:NVelocity的增强功能       text which appears for each item
MonoRail学习笔记十三:NVelocity的增强功能#before
MonoRail学习笔记十三:NVelocity的增强功能       text which appears before each item
MonoRail学习笔记十三:NVelocity的增强功能#after
MonoRail学习笔记十三:NVelocity的增强功能       text which appears after each item
MonoRail学习笔记十三:NVelocity的增强功能#between
MonoRail学习笔记十三:NVelocity的增强功能       text which appears between each two items
MonoRail学习笔记十三:NVelocity的增强功能#odd
MonoRail学习笔记十三:NVelocity的增强功能       text which appears for every other item, including the first
MonoRail学习笔记十三:NVelocity的增强功能#even
MonoRail学习笔记十三:NVelocity的增强功能       text which appears for every other item, starting with the second
MonoRail学习笔记十三:NVelocity的增强功能#nodata
MonoRail学习笔记十三:NVelocity的增强功能       Content rendered if $items evaluated to null or empty
MonoRail学习笔记十三:NVelocity的增强功能#beforeall
MonoRail学习笔记十三:NVelocity的增强功能       text which appears before the loop, only if there are items
MonoRail学习笔记十三:NVelocity的增强功能       matching condition
MonoRail学习笔记十三:NVelocity的增强功能#afterall
MonoRail学习笔记十三:NVelocity的增强功能       text which appears after the loop, only of there are items
MonoRail学习笔记十三:NVelocity的增强功能       matching condition
MonoRail学习笔记十三:NVelocity的增强功能#end
比如如下的一个例子:
MonoRail学习笔记十三:NVelocity的增强功能#foreach($person in $people)
MonoRail学习笔记十三:NVelocity的增强功能#beforeall
MonoRail学习笔记十三:NVelocity的增强功能       
<table>
MonoRail学习笔记十三:NVelocity的增强功能               
<tr>
MonoRail学习笔记十三:NVelocity的增强功能               
<th>Name</th>
MonoRail学习笔记十三:NVelocity的增强功能               
<th>Age</th>
MonoRail学习笔记十三:NVelocity的增强功能               
</tr>
MonoRail学习笔记十三:NVelocity的增强功能#before
MonoRail学习笔记十三:NVelocity的增强功能       
<tr
MonoRail学习笔记十三:NVelocity的增强功能
#odd
MonoRail学习笔记十三:NVelocity的增强功能       Style
='color:gray'>
MonoRail学习笔记十三:NVelocity的增强功能#even
MonoRail学习笔记十三:NVelocity的增强功能       Style='color:white'>
MonoRail学习笔记十三:NVelocity的增强功能
MonoRail学习笔记十三:NVelocity的增强功能#each
MonoRail学习笔记十三:NVelocity的增强功能       
<td>$person.Name</td>
MonoRail学习笔记十三:NVelocity的增强功能       
<td>$person.Age</td>
MonoRail学习笔记十三:NVelocity的增强功能
MonoRail学习笔记十三:NVelocity的增强功能#after
MonoRail学习笔记十三:NVelocity的增强功能       
</tr>
MonoRail学习笔记十三:NVelocity的增强功能
MonoRail学习笔记十三:NVelocity的增强功能#between
MonoRail学习笔记十三:NVelocity的增强功能       
<tr><td colspan='2'>$person.bio</td></tr>
MonoRail学习笔记十三:NVelocity的增强功能
MonoRail学习笔记十三:NVelocity的增强功能#afterall
MonoRail学习笔记十三:NVelocity的增强功能       
</table>
MonoRail学习笔记十三:NVelocity的增强功能
MonoRail学习笔记十三:NVelocity的增强功能#nodata
MonoRail学习笔记十三:NVelocity的增强功能       Sorry No Person Found
MonoRail学习笔记十三:NVelocity的增强功能#end
MonoRail学习笔记十三:NVelocity的增强功能
当我们$people中有两条记录时会生成以下html:
MonoRail学习笔记十三:NVelocity的增强功能<table>
MonoRail学习笔记十三:NVelocity的增强功能       
<tr>
MonoRail学习笔记十三:NVelocity的增强功能       
<th>Name</th>
MonoRail学习笔记十三:NVelocity的增强功能       
<th>Age</th>
MonoRail学习笔记十三:NVelocity的增强功能       
</tr>
MonoRail学习笔记十三:NVelocity的增强功能       
<tr style='color:white'>
MonoRail学习笔记十三:NVelocity的增强功能               
<td>John</td>
MonoRail学习笔记十三:NVelocity的增强功能               
<td>32</td>
MonoRail学习笔记十三:NVelocity的增强功能       
</tr>
MonoRail学习笔记十三:NVelocity的增强功能       
<tr><td colspan='2'>Monorail programmer</td></tr>
MonoRail学习笔记十三:NVelocity的增强功能       
<tr style='color:gray'>
MonoRail学习笔记十三:NVelocity的增强功能               
<td>Jin</td>
MonoRail学习笔记十三:NVelocity的增强功能               
<td>12</td>
MonoRail学习笔记十三:NVelocity的增强功能       
</tr>
MonoRail学习笔记十三:NVelocity的增强功能       
<tr><td colspan='2'>Castle guru</td></tr>
MonoRail学习笔记十三:NVelocity的增强功能
</table>
当$people为null时会直接输出:
MonoRail学习笔记十三:NVelocity的增强功能Sorry No Person Found

四、枚举类型的改进
为了可读性,可以自己使用枚举类型的文字表达进行比较。
例:
MonoRail学习笔记十三:NVelocity的增强功能public enum OrderStatus
MonoRail学习笔记十三:NVelocity的增强功能
{
MonoRail学习笔记十三:NVelocity的增强功能  Undefined,
MonoRail学习笔记十三:NVelocity的增强功能  Created,
MonoRail学习笔记十三:NVelocity的增强功能  Dispatched
MonoRail学习笔记十三:NVelocity的增强功能}
那么可以在vm中如下比较:
MonoRail学习笔记十三:NVelocity的增强功能#if($order == "Undefined")
MonoRail学习笔记十三:NVelocity的增强功能  Sorry, but we don't know this order.
MonoRail学习笔记十三:NVelocity的增强功能#elseif($order == "Created")
MonoRail学习笔记十三:NVelocity的增强功能  Your order is being processed. Hold on!
MonoRail学习笔记十三:NVelocity的增强功能#elseif($order == "Dispatched")
MonoRail学习笔记十三:NVelocity的增强功能  Your order has been dispatched through UPS. Cross your fingers!
MonoRail学习笔记十三:NVelocity的增强功能#end
(原文中好像有点问题,我重新改了一些代码)

Castle1.0 RC3中的新功能:
1、在vm中,方法和属性不再区分大小写,使用时可以不必记住大小写了
2、字典功能改进,在vm字典调用时可以直接使用以下方式(参见上面的内置字典支持):
    key='value' key=1 key=1.2 key='1' $key='value' key=$value key='some$value'
    本文转自永春博客园博客,原文链接:http://www.cnblogs.com/firstyi/archive/2007/11/02/945982.html,如需转载请自行联系原作者
上一篇:[redis设计与实现][4]基本数据结构——跳跃表


下一篇:批处理bat文件的写作教程及实例