.NET 平台模板引擎,是 Java 平台 Velocity 的 .NET 移植版本。
介绍
ASP.NET 项目中使用广泛;
ASP.NET MVC 配套有 Razor 模板;
传统 .aspx 页面项目想要引入 MVC 模式时,很多开发者选用 NVelocity。
NVelocity 早已停止维护,仅用于老旧 .NET Framework 历史项目;新项目优先使用 Razor、Handlebars.NET 等现代模板引擎。
版本与 .NET Framework 对应关系
| .NET Framework 版本 | NVelocity 版本 |
|---|---|
| .NET 4.0 | 1.0(官方最新版) |
| .NET 2.0 | 0.5 |
| .NET 1.0 | 0.48 |
Velocity 是老牌 Java 模板引擎,语法简洁,使用 #、$ 作为模板标记;NVelocity 完整移植这套语法;
下载
官方最后一次更新是2018年,最新的版本是1.2.0
读者可以到下面地址下载
它是开源的,托管在GitHub castleproject/NVelocity: Castle’s NVelocity
官方下载的不是编译好的dll,读者可以下载下来后,自己编译,或者直接把项目引入到你项目的解决方案中。

用vs打开sln
最后一个版本是基于.NET Core 2.1的 建议读者可以把它升级到.NET 4.8
编译后,在目录下面 就可以看到 dll

然后引入到其他asp.net web 项目中就可以。把上面的NVelocity.dll 引入到您的web项目中。
引入项目
项目中引用程序集:NVelocity.dll
核心优势:基于该模板引擎,实现网站多模板切换(换肤)十分便捷
在网站根目录创建文件夹:Themes,作为所有模板存放根目录
在 Themes 内部建立多个主题文件夹,例如:
我们在网站根目录下面创建Themes文件夹,作为主题目录
主题目录
然后创建一个default文件夹,作为 默认模板
后续可新增 Themes/blue、Themes/dark 等多套模板
网站根目录
└── Themes
├── default # 默认主题模板文件
├── dark # 深色主题模板文件
└── blue # 蓝色主题模板文件Code language: PHP (php)
运行时通过配置读取当前启用的主题名称,NVelocity 加载对应主题目录下的模板文件;
切换模板本质:修改配置指向不同主题文件夹,无需改动业务逻辑代码;
适合老旧 ASP.NET WebForm(aspx)项目实现前台页面换肤功能。
aspx
新建一个aspx的页面 ,网站根目录新建 Register.aspx,作为演示页面访问。
在 Themes/default 目录下新建模板文件:register.htm,它作为NVelocity 模板文件,存放 HTML 与 Velocity 模板语法
打开 Register.aspx,仅保留页面指令,删除其余所有 HTML 内容:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Register.aspx.cs" Inherits="NVelocityStudy.Web.Register" %>Code language: HTML, XML (xml)
aspx 不再负责渲染页面,仅充当控制器入口,由后台代码调用 NVelocity 加载 register.htm 模板输出内容。
网站根目录
├─ Register.aspx # 访问入口
├─ Register.aspx.cs # 后台逻辑
└─ Themes
└─ default
└─ register.htm # NVelocity模板页面Code language: CSS (css)
后续在 Register.aspx.cs 编写代码,指定加载当前主题下的 register.htm 模板、传入数据模型,最终输出 HTML
如果切换主题,只需要修改主题目录指向,加载对应主题文件夹内的 register.htm

aspx.cs
打开后台代码文件:Register.aspx.cs 在 Page_Load 方法内编写 NVelocity 渲染逻辑,页面加载时执行模板解析输出。
using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace NVelocityStudy.Web
{
public partial class Register : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
// 此处编写NVelocity加载模板、渲染页面的代码
}
}
}Code language: C# (cs)
pageload中添加下面代码
protected void Page_Load(object sender, EventArgs e)
{
//第一步 创建Velocity引擎实例 VelocityEngine
VelocityEngine ve = new VelocityEngine();
//第二步 初始化引擎配置
ExtendedProperties pros = new ExtendedProperties();
pros.AddProperty(RuntimeConstants.RESOURCE_LOADER, "file"); // 文件方式加载模板
pros.AddProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, Server.MapPath(@"")); // 模板根目录
ve.Init(pros); // 使用配置初始化引擎
//第三步 读取模板文件
Template template = ve.GetTemplate("themes/default/register.htm");
//第四步 创建上下文,向模板传递变量
IContext context = new VelocityContext();
context.Put("websiteName", "FoxDevelop");
context.Put("domainName", "foxdevelop.com");
//第五步 合并模板与数据,渲染HTML
StringWriter writer = new StringWriter();
template.Merge(context, writer); //渲染结果存入writer
//第六步 输出页面
Response.Write(writer.ToString().Replace("\r\n", "<br/>"));
}Code language: C# (cs)
这段代码,就是读取模板html文件,并且创建一些变量,用来替换html中的占位符
- 实例化 VelocityEngine 独立引擎对象,区别于全局静态
Velocity.Init(),支持多套独立配置。 - 引擎初始化与配置
RESOURCE_LOADER=file:指定模板加载方式为本地文件;FILE_RESOURCE_LOADER_PATH:设置模板查找根路径;ve.Init(pros):加载配置完成初始化。
- 加载模板
GetTemplate()基于配置的根路径,读取themes/default/register.htm模板文件。 - VelocityContext 数据上下文
context.Put(键, 值):把 C# 变量传入模板,在 htm 中使用$websiteName、$domainName取值。 - 模板 Merge 渲染
template.Merge(上下文, 输出流),将变量填充进模板,生成完整 HTML 字符串; 使用StringWriter接收渲染后的文本。 - Response 输出 把最终 HTML 发送浏览器;
Replace("\r\n","<br/>"):将源码换行符转换为 HTML 换行标签。
htm模板
修改主题目录中的register.htm
<!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></title>
</head>
<body>
网站:$websiteName <br />
域名:$domainName
</body>
</html>Code language: HTML, XML (xml)
上面两个$xxxxxxx 就是pageload中创建的两个变量的占位符,渲染过程会替换成对应的值。
- 变量标识
$变量名$websiteName、$domainName是 NVelocity (VTL) 变量语法。 程序代码中context.Put("websiteName", "FoxDevelop")赋值,渲染时引擎自动替换:
$websiteName→FoxDevelop$domainName→foxdevelop.com
运行效果
网站:FoxDevelop
域名:foxdevelop.comCode language: CSS (css)