zoukankan      html  css  js  c++  java
  • ASP.NET MVC 使用 nVelocity 视图模板引擎

    from:http://space.itpub.net/12639172/viewspace-434696
    在你在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:
    'k pMd-F'A`k d{0从下面的网站中下载并解压MvcContrib的二进制文件:http://www.CodePlex.com/MvcContrib

    Step 2:
    d#P^6Td5U#V0从下面的网站中下载并解压Castle项目:http://www.castleproject.org/castle/download.html

    Step 3:
    'b3G])y&C&wr,``0当你解压Step 2的文件后,导航到bin目录,解压external-dependencies.zip文件。这个文件包含了nVelocity.dll程序集。

    Step 4:
    2e8~k ZfS0创建一个新的Visual Studio 2008 ASP.NET MVC Application。

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

    Step 6ITPUB个人空间b.s.|#E]2F7fw
    添加一个你在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#)ITPUB个人空间4eOVDk B#s s

    using System.Web.Mvc;
    [&^.zMEu7d.y]&_ SZ?0
    using Tip19.Models;ITPUB个人空间+zR4yF l r

    d|9x0N%S:j`Q0
    namespace Tip19.Controllers
    K4[*h(G~I0
    {
    h:~0v+U2yc_kb&c0
    publicclass HomeController : Controller
    (j4RC3p_n G-S0
    {
    (r)lW9ltW0
    private MovieDataContext _dataContext =new MovieDataContext();
    9fAklrV0ITPUB个人空间O&~SO3[M3~9PD h
    public ActionResult Index()ITPUB个人空间$\R ziQ"Nmi
    {
    ;dmZM6C0
    this.ViewEngine =new MvcContrib.Castle.NVelocityViewFactory();
    ^~}-VD.o`1R7q0
    q_1\u#e1{z@0
    return View(_dataContext.Movies);ITPUB个人空间z%M"k)pz
    }
    ITPUB个人空间W9u$k {7D|2l ^3y
    }
    ITPUB个人空间%O;Z5j(H'P6v rT5ySf
    }

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

    Listing 2 – VelocityControllerFactory.cs (C#)

    using System;ITPUB个人空间X!V H$I9ij4L/O
    using System.Web.Mvc;ITPUB个人空间%a)uIj%Q+n*\fq&k.h
    ITPUB个人空间q Mo$b@!|Sl
    namespace Tip19.Controllers
    |?c+Su2\9h,M0
    {
    H H@ AF1F:Z0
    publicclass VelocityControllerFactory : DefaultControllerFactory ITPUB个人空间#w!j8LV]9Ds4T
    { ITPUB个人空间D9no,i6I0L F*{/Enp
    protectedoverride IController GetControllerInstance(Type controllerType)
    'o-f4@B(p5`0
    {
    GX2mr7M`A"}7x0 IController controller
    =base.GetControllerInstance(controllerType);
    {jkM};s3yJ8R G/X9N0 Controller velocityController
    = controller as Controller;
    (jm `O i(x)@;w ?0
    if (velocityController !=null) ITPUB个人空间yhlRn&B9xT
    {
    WCc*B:C z"vY0 var context
    =new ControllerContext(this.RequestContext, velocityController);
    ` H{+a+Bi#@(V0 velocityController.ViewEngine
    =new MvcContrib.Castle.NVelocityViewFactory();ITPUB个人空间C9Y{bMv;_-B-~x
    }

    q&P'ZyX.^Ww0
    return controller;
    #f @3Z j!kY.X M3R0 }

    0{Sr5cvX2Mj'Q0 }
    ITPUB个人空间$i5x ~\b a2?
    }

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

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

    using System;
    .sb b,w,zP)O j YF!y0
    using System.Collections.Generic;ITPUB个人空间`9j8Xc.H3`$S
    using System.Linq;
    ~K2by B(q0kj0
    using System.Web;ITPUB个人空间#]A@@9zZ
    using System.Web.Mvc;ITPUB个人空间2K }5X}i:v[8]
    using System.Web.Routing;ITPUB个人空间 ^$m K3A%b} Ki Z
    using Tip19.Controllers;ITPUB个人空间*u|N&[.D E u

    `}mWKth0
    namespace Tip19ITPUB个人空间jj#T;D0G
    {ITPUB个人空间@{/z.Vor EA
    publicclass GlobalApplication : System.Web.HttpApplicationITPUB个人空间)RM\ n(L)h
    {ITPUB个人空间%D^HI1Vi!zC
    publicstaticvoid RegisterRoutes(RouteCollection routes)ITPUB个人空间5dD)lqtp
    {ITPUB个人空间 H8BW*Z7_0r
    routes.IgnoreRoute(
    "{resource}.axd/{*pathInfo}");
    r z M7FJ*h)P0
    c2A{6] ?6m0B|0 routes.MapRoute(
    uR1U$}D,`w4u0
    "Default", // Route nameITPUB个人空间3NbN:hqz;w Gj*Y
    "{controller}/{action}/{id}", // URL with parametersITPUB个人空间q/\)u2r w CE
    new{ controller ="Home", action ="Index", id ="" }// Parameter defaultsITPUB个人空间I'UW d+xDJ
    );
    p_N h(`tV0
    l.ghiQ0AH0 }
    ITPUB个人空间@%t0sB q [W
    ITPUB个人空间 kdS(fm ] FC ic
    protectedvoid Application_Start()ITPUB个人空间(F&k"^H(|}'Q1N.e
    {
    \5s ^4J0[ n`0 ControllerBuilder.Current.SetControllerFactory(
    typeof(VelocityControllerFactory));ITPUB个人空间kgZ8d)J.S4\!e-d
    RegisterRoutes(RouteTable.Routes);
    7z0Uoo/^%GT%o;C.k0 }
    ITPUB个人空间UybbWn&r,F8\
    }

    #Y/? m&r8C v0}

    在你注册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">
    s"}f#n:sr0
    <html xmlns="http://www.w3.org/1999/xhtml">
    2[4B4V+w]0
    <head>
    "BGx!q:r&C@2n0
    <title>Untitled Page</title>
    APv)] O$r(G0
    </head>ITPUB个人空间 | ~:U].y7}D
    <body>
    ;i G ~1`&~+e8~Z0ITPUB个人空间P LX/l&^3Aj

    5b!HhRd[*\*P0#
    foreach( $movie in $Viewdata.Model )ITPUB个人空间+y'q+A{JMR:B
    <li><a href="/Home/Edit/$movie.Id">$movie.Title</a></li>ITPUB个人空间;N9d9aeg0Q[5k(h
    #endITPUB个人空间9i6V3uCQo7GLU0FX
    ITPUB个人空间u*~0~MJ"qz'sF)ct
    </body>
    s,YPW$]#D3Vx i%} s0
    </html>
    B#~Qfj!qvqpW0

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

    总结

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

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

  • 相关阅读:
    关于子类中不能调用基类中定义的事件问题
    比尔·盖茨在哈佛大学毕业典礼上的演讲
    一个QA讲解的回文判断函数
    mybatis和spring整合时这个报错,应该这样解决!
    “老师,为什么我一上课就感到困,听课听的总是走神?”
    最好的方法,是为你们量身定制!
    “桌面日历”记录的事件居然是看某某视频……
    干货!sqlserver数据库所有知识点总结整理,含代码(挺全的)
    越优秀的人越努力,越努力的人越幸运!
    挺不喜欢下雪的
  • 原文地址:https://www.cnblogs.com/luoyaoquan/p/2598430.html
Copyright © 2011-2022 走看看