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

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

一、支持数组参数
比如在Controller中定义如下方法:
         public   void  Index()
        
{
            PropertyBag.Add(
"instance"this);
        }

        
public   static   string  Welcome( params  String[] args)
        
{
            
return String.Join("-", args);
        }
在vm中写:
$instance.Welcome( ' arg1 ' ' arg2 ' )
那么回输出如下结果:
arg1-arg2

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

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


            sResult.Append(
"/>");

            
return sResult.ToString();
        }

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

三、更强的foreach功能(这个功能比较好)
可以指定在foreach之前、之后等特定时候执行一些语句,具体语法如下:
#foreach($i in $items)
#each (this is optional since its the default section)
       text which appears for each item
#before
       text which appears before each item
#after
       text which appears after each item
#between
       text which appears between each two items
#odd
       text which appears for every other item, including the first
#even
       text which appears for every other item, starting with the second
#nodata
       Content rendered if $items evaluated to null or empty
#beforeall
       text which appears before the loop, only if there are items
       matching condition
#afterall
       text which appears after the loop, only of there are items
       matching condition
#end
比如如下的一个例子:
#foreach($person in $people)
#beforeall
       
< table >
               
< tr >
               
< th > Name </ th >
               
< th > Age </ th >
               
</ tr >
#before
       
< tr
#odd
       Style
='color:gray' >
#even
       Style='color:white'>

#each
       
< td > $person.Name </ td >
       
< td > $person.Age </ td >

#after
       
</ tr >

#between
       
< tr >< td  colspan ='2' > $person.bio </ td ></ tr >

#afterall
       
</ table >

#nodata
       Sorry No Person Found
#end
当我们$people中有两条记录时会生成以下html:
< table >
       
< tr >
       
< th > Name </ th >
       
< th > Age </ th >
       
</ tr >
       
< tr  style ='color:white' >
               
< td > John </ td >
               
< td > 32 </ td >
       
</ tr >
       
< tr >< td  colspan ='2' > Monorail programmer </ td ></ tr >
       
< tr  style ='color:gray' >
               
< td > Jin </ td >
               
< td > 12 </ td >
       
</ tr >
       
< tr >< td  colspan ='2' > Castle guru </ td ></ tr >
</ table >
当$people为null时会直接输出:
Sorry No Person Found

四、枚举类型的改进
为了可读性,可以自己使用枚举类型的文字表达进行比较。
例:
public   enum  OrderStatus
{
  Undefined,
  Created,
  Dispatched
}
那么可以在vm中如下比较:
#if($order == "Undefined")
  Sorry, but we don't know this order.
#elseif($order == "Created")
  Your order is being processed. Hold on!
#elseif($order == "Dispatched")
  Your order has been dispatched through UPS. Cross your fingers!
#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,如需转载请自行联系原作者



相关文章
|
3月前
|
BI
SAP ABAP 显式增强技术之 New BAdI 的实战介绍 - 如何创建和激活增强实现试读版
SAP ABAP 显式增强技术之 New BAdI 的实战介绍 - 如何创建和激活增强实现试读版
19 0
|
7月前
|
Web App开发 前端开发 JavaScript
SAP UI5 应用开发教程之九十八 - 从 viewId 这个属性谈起,聊聊 SAP UI5 的 HTML 源代码生成机制试读版
SAP UI5 应用开发教程之九十八 - 从 viewId 这个属性谈起,聊聊 SAP UI5 的 HTML 源代码生成机制试读版
41 0
|
测试技术 Python
【第五篇-完结篇】XiaoZaiMultiAutoAiDevices之改造扩展
在前面系列文章中有讲到,使用configparser,ini格式的文件作为配置文件,在新增或者删除其中的值时,会丢失所有注释,所以在框架源码注释中我有写到,如果对这方面比较介意或者是有需求的话,可以进行更改配置文件。
106 0
|
开发框架 .NET 中间件
浅入ABP(1):搭建基础结构的 ABP 解决方案
浅入ABP(1):搭建基础结构的 ABP 解决方案
131 0
浅入ABP(1):搭建基础结构的 ABP 解决方案
|
Web App开发 前端开发 .NET
【ABP框架系列学习】模块系统(4)
原文:【ABP框架系列学习】模块系统(4) 0.引言 ABP提供了构建模块和通过组合模块以创建应用程序的基础设施。一个模块可以依赖于另外一个模块。通常,程序集可以认为是模块。如果创建多个程序集的应用程序,建议为每个程序集创建模块定义。
1535 0
|
前端开发 JavaScript .NET
【ABP框架系列学习】介绍篇(1)
原文:【ABP框架系列学习】介绍篇(1)   0.引言 该系列博文主要在【官方文档】及【tkbSimplest】ABP框架理论研究系列博文的基础上进行总结的,或许大家会质问,别人都已经翻译过了,这不是多此一举吗?原因如下: 1.【tkbSimplest】的相关博文由于撰写得比较早的,在参照官方文档学习的过程中,发现部分知识未能及时同步(当前V4.0.2版本),如【EntityHistory】、【Multi-Lingual Engities】章节未涉及、【Caching】章节没有Entity Caching等内容。
1813 0
|
C# 开发者 容器
MEF 插件式开发 - 小试牛刀
原文:MEF 插件式开发 - 小试牛刀 目录 MEF 简介 实践出真知 面向接口编程 控制反转(IOC) 构建入门级 MEF 相关参考 MEF 简介 Managed Extensibility Framework 即 MEF 是用于创建轻量、可扩展应用程序的库。
880 0