Mike

导航

ASP.NET MVC Tip #19 – 使用 nVelocity 视图模板引擎


ASP.NET MVC Tip #19 – 使用 nVelocity 视图模板引擎
ASP.NET MVC Tip #19 – Use the nVelocity View Engine

美语原文:http://weblogs.asp.net/stephenwalther/archive/2008/07/14/asp-net-mvc-tip-19-use-the-nvelocity-view-engine.aspx
国语翻译:http://www.cnblogs.com/mike108mvp

译者注:在下水平有限,翻译中若有错误或不妥之处,欢迎大家批评指正。谢谢。

译者注:ASP.NET MVC QQ交流群 1215279 欢迎对 ASP.NET MVC 感兴趣的朋友加入

在这篇帖子中,我演示了在你在ASP.NET MVC application呈现视图时,如何使用nVelocity视图模板引擎,而不是使用通常的Web Forms视图引擎。

默认情况下,你可以创建ASP.NET Web Form文件(.aspx)来为ASP.NET MVC application创建视图。你并不是必须这么做。如果你喜欢,你可以替换掉Web Forms视图引擎,然后使用其它的视图模板引擎。在这篇帖子中,我将演示如何使用nVelocity视图模板引擎。

为什么要使用nVelocity 模板引擎,而不用通常的Web Forms 模板引擎呢?你可能会有几个不同的理由。首先,nVelocity是从Java Apache Software Foundation的 Velocity项目引入到.NET framework版本的。 如果你正在将一个现在的Java 应用程序迁移到.NET平台中,并且该程序使用了Velocity模板引擎,那么使用 nVelocity 模板引擎能够让这个迁移过程更顺利。

其次,与ASP.NET Web Forms的语法相比较而言,你可能更喜欢nVelocity模板引擎的语法。Velocity 模板引擎语言是专门为了创建HTML页面而设计的。Velocity提供给你一个非常干净的语法来实现通用操作,例如循环一批数据库记录,并把每条记录显示在一个HTML页面中(可以认为是HTML领域专用的语言)。

为ASP.NET MVC配置nVelocity

我花了很长时间去弄明白如何配置nVelocity才能让它与ASP.NET MVC一起工作。问题是你必须从两个不同的项目中提取文件,并让它们一起工作(有些程序集隐藏在嵌套文件夹中)。

这里是让nVelocity工作的步骤:

Step 1:
从下面的网站中下载并解压MvcContrib的二进制文件:http://www.CodePlex.com/MvcContrib

Step 2:
从下面的网站中下载并解压Castle项目:http://www.castleproject.org/castle/download.html

Step 3:
当你解压Step 2的文件后,导航到bin目录,解压external-dependencies.zip文件。这个文件包含了nVelocity.dll程序集。

Step 4:
创建一个新的Visual Studio 2008 ASP.NET MVC Application。

Step 5:
添加一个MvcContrib.Castle引用,你可以从Step 1中下载的文件中找到它。(MvcContrib.Castle 程序集是MvcContrib项目的一部分,而不是Castle项目的一部分)

Step 6
添加一个你在Step 3中解压的NVelocity程序集的引用。

有两个重要警告。首先,不要使用http://nvelocity.sourceforge.net/中的nVelocity 程序集。如果你在搜索引擎中搜索nVelocity,这个是搜索结果的第一项。遗憾的是,这个项目自从2003以来还没有被更新过,并且这里的nVelocity已经严重过时了。你应该使用Castle项目中的nVelocity 程序集。

其次,确保你在解压它们之前,没有阻止(Unblock)任何文件。你可以通过右键单击某个文件 -> 选择Properties选项 -> 点击Unblock 按钮,来取消阻止(Unblock)一个文件。如果你未能成功地取消阻止(Unblock)一个压缩文件,那么当你试图在Visual Studio 2008中使用这些文件时,你将会遇到安全问题。

使用nVelocity模板引擎

当你结束上面的这些步骤之后,你就可以开始使用nVelocity 模板引擎了。有两种方式指示ASP.NET MVC framework你要使用nVelocity模板引擎,而不是通常的Web Forms模板引擎。

首先,你可以在返回一个View之前,修改controller action中的ViewEngine属性。例如,在代码清单中的HomeController为Index() action使用了nVelocity。

Listing 1 – HomeController.cs (C#)

using System.Web.Mvc;
using Tip19.Models;

namespace Tip19.Controllers
{
    
public class HomeController : Controller
    
{
        
private MovieDataContext _dataContext = new MovieDataContext();

        
public ActionResult Index()
        
{
            
this.ViewEngine = new MvcContrib.Castle.NVelocityViewFactory();

            
return View(_dataContext.Movies);
        }

    }

}


如果你只是想在你的Web应用程序的某些页面中使用nVelocity,那么设置ViewEngine属性就是一种更换视图模板引擎的简易方式。然而如果你想让你所有的Views都使用nVelocity,那么你应该考虑创建一个自定义的Controller Factory。在代码清单2中的自定义Controller Factory将默认模板引擎改为nVelocity。

Listing 2 – VelocityControllerFactory.cs (C#)

using System;
using System.Web.Mvc;

namespace Tip19.Controllers 

    
public class VelocityControllerFactory : DefaultControllerFactory 
    

        
protected override IController GetControllerInstance(Type controllerType) 
        

            IController controller 
= base.GetControllerInstance(controllerType); 
            Controller velocityController 
= controller as Controller;
            
if (velocityController != null
            
{
                var context 
= new ControllerContext(this.RequestContext, velocityController);
                velocityController.ViewEngine 
= new MvcContrib.Castle.NVelocityViewFactory();
            }
 
            
return controller; 
        }
 
    }
 
}

为了使用自定义Controller Factory,你必须在你的应用程序的Global.asax 文件中注册这个factory。代码清单3中被修改过的Global.asax在Application_Start()方法中包含了一个对SetControllerFactory() 方法的调用。

Listing 3 – Global.asax.cs (C#)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using Tip19.Controllers;

namespace Tip19
{
    
public class GlobalApplication : System.Web.HttpApplication
    
{
        
public static void RegisterRoutes(RouteCollection routes)
        
{
            routes.IgnoreRoute(
"{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                
"Default",                                              // Route name
                "{controller}/{action}/{id}",                           // URL with parameters
                new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
            );

        }


        
protected void Application_Start()
        
{
            ControllerBuilder.Current.SetControllerFactory(
typeof(VelocityControllerFactory));
            RegisterRoutes(RouteTable.Routes);
        }

    }

}

在你注册VelocityControllerFactory之后,在你的MVC应用程序中所有的controller都将默认使用nVelocity 模板引擎。你不再需要在每个controller action中修改ViewEngine 属性。

创建一个nVelocity View

你可以通过创建一个后缀名为.vm 的文件来创建一个nVelocity View。Visual Studio 没有包含Velocity views的模板。你可以通过创建一个HTML page并且将它的扩展名从.htm改为.vm 来创建一个 Velocity view。

例如,代码清单4中的View包含了一个Velocity 模板,它在页面上显示了所有在代码清单1中的HomeController 中传递过来的电影movies 。

Listing 4 – Views\Home\Index.vm

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    
<title>Untitled Page</title>
</head>
<body>


#
foreach( $movie in $Viewdata.Model )
    
<li><a href="/Home/Edit/$movie.Id">$movie.Title</a></li>
#end

</body>
</html>

代码清单4中的View使用了Velocity 模板语言来显示movies。注意那个for…each代码块是使用Velocity 指令#foreach 和 #end来创建的。注意你使用$来标识变量。因此,你可以用表达式$Viewdata.Model来指代(refer to)ViewData.Model。Velocity是不区分大小写的。

Apache Software Foundation的网站有一个完整的Velocity 语言的参考文档。这个网站也有一个快速入门指导,请看:

http://velocity.apache.org/engine/releases/velocity-1.5/vtl-reference-guide.html

http://velocity.apache.org/engine/releases/velocity-1.5/user-guide.html

总结

在这篇帖子中,我演示了如何在ASP.NET MVC application中使用nVelocity 模板引擎。我展示了两种方法来替换默认使用的Web Forms视图引擎。你展示了如何为一个特定的controller action指定一个特定的视图引擎,以及如何为所有的controller action指定一个特定的视图引擎。

我当然并不是推荐你放弃Web Forms视图引擎而改用nVelocity。我这篇帖子真正的目的是演示了ASP.NET MVC的灵活性。如果你不喜欢ASP.NET MVC framework的任何一个部分,你都可以选择替换掉它。

下载代码:http://weblogs.asp.net/blogs/stephenwalther/Downloads/Tip19/Tip19.zip

posted on 2008-07-20 16:06  mike108mvp  阅读(2774)  评论(3编辑  收藏  举报