NVelocity介绍

.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.01.0(官方最新版)
.NET 2.00.5
.NET 1.00.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.csPage_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中的占位符

  1. 实例化 VelocityEngine 独立引擎对象,区别于全局静态Velocity.Init(),支持多套独立配置。
  2. 引擎初始化与配置
  • RESOURCE_LOADER=file:指定模板加载方式为本地文件;
  • FILE_RESOURCE_LOADER_PATH:设置模板查找根路径;
  • ve.Init(pros):加载配置完成初始化。
  1. 加载模板 GetTemplate() 基于配置的根路径,读取 themes/default/register.htm 模板文件。
  2. VelocityContext 数据上下文context.Put(键, 值):把 C# 变量传入模板,在 htm 中使用$websiteName$domainName取值。
  3. 模板 Merge 渲染template.Merge(上下文, 输出流),将变量填充进模板,生成完整 HTML 字符串; 使用StringWriter接收渲染后的文本。
  4. 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中创建的两个变量的占位符,渲染过程会替换成对应的值。

  1. 变量标识 $变量名 $websiteName$domainName 是 NVelocity (VTL) 变量语法。 程序代码中 context.Put("websiteName", "FoxDevelop") 赋值,渲染时引擎自动替换:
  • $websiteNameFoxDevelop
  • $domainNamefoxdevelop.com

运行效果

网站:FoxDevelop
域名:foxdevelop.comCode language: CSS (css)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注