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 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.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.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
<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 阅读(2778) 评论(3) 编辑 收藏 举报