前面写过一篇关于 Java 中使用 Velocity 模板的文章:掌握一种Java模板技术 -- Velocity,现在要考究一下 C# 中怎么使用相应的 nVelocity 模板。
当目光转移到了 C#/.Net 之后,但凡想要找个某个功能组件时都会联想到,曾经在 Java 中用过什么,.Net 中应该会有它相应的实现,例如 Spring.Net, nHibernate, iTextSharp,还有这里的 nVelocity,特点就是组件名一般是 .Net 结尾或 n 字打头。
还是依照原来的例子,从 http://sourceforge.net/projects/nvelocity/files/ 下载 nVelocity 组件,当前版本是 NVelocity-0.4.2.8580。下载后解压,在你的项目中引入 build 目录中的 NVelocity.dll,如果是 web 项目中用 nVelocity,可附加引入 NVelocity.Http.dll。
第一步:建立模板,模板语言的语法也基本一致的,如创建文件 HelloNVelocity.vm,把它放在 d:\tempalte\ 目录下,内容为:
1 2 |
## {单据责任人}:您的 {单据号} 号{单据类型}在 {操作日期} 日已支付 ${owner}:您的 ${bill} 号${type}在 ${date} 已支付 |
第二步:加载模板,填充值,输出,HelloNVelocity.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
using System; using System.IO; using NVelocity; using NVelocity.App; using NVelocity.Runtime; public class HelloNVelocity { public static void Main(string[] args) { VelocityEngine vltEngine = new VelocityEngine(); vltEngine.SetProperty(RuntimeConstants_Fields.RESOURCE_LOADER, "file"); vltEngine.SetProperty(RuntimeConstants_Fields.FILE_RESOURCE_LOADER_PATH, "d:/Template/"); vltEngine.Init(); Template vltTemplate = vltEngine.GetTemplate("HelloNVelocity.vm"); VelocityContext vltContext = new VelocityContext(); vltContext.Put("owner", "Unmi"); vltContext.Put("bill", "1000"); vltContext.Put("type", "报销单"); vltContext.Put("date", DateTime.Now.ToLongDateString()); StringWriter vltWriter = new StringWriter(); vltTemplate.Merge(vltContext, vltWriter); Console.WriteLine(vltWriter.GetStringBuilder().ToString()); Console.Write("Press any key to continue . . . "); Console.ReadKey(true); } } |
执行后,控制台输出:
Unmi:您的 1000 号报销单在 2010年5月19日 已支付
代码逻辑与 Java 的 Velocity 组件的应用是完全一致的,加载模板->填充值->合并模板输出内容。
同时也要注意模板文件有中文的话要以 UTF-8 字符集保存,不然会出现乱码,需然默认的字符集仍然是 ISO8859-1。还应留意 Runtime.Resource.Loader Namespace 中,你可以从中体查出它支持哪些方式来加载模板文件:
1. FileResourceLoader 从文件系统加载模板文件
2. ResourceLocator 从文件系统或程序集中加载资源作为模板
3. DataSourceResourceLoader 从数据源中加载内容作为模板,奇怪的是这个类出现在源代码中,却未编译到 NVelocity.dll 中。
另外它的配置文件在 NVelocity.dll 的资源 Runtime\Defaults\nvelocity.properties 中。
NVelocity 使用了与 Velocity 保持一致的 VTL(Velocity Template Language) 语言,支持 #if、#foreach、#set、#include、#parse、#macro 等语法能处理你更复杂的数。
参考:1. .Net之NVelocity的三种用法
2. 封装ASP.NET模板引擎NVelocity应用实例
3. .NET模板引擎 NVelocity 其中有 NVelocity 的介绍和 VTL 语法说明
本文链接 https://yanbin.blog/csharp-velocity-templat/, 来自 隔叶黄莺 Yanbin Blog
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。
难道不应该使用RazorEngine吗?
显然的,不能再用 nvelocity 了,因为这篇日志是七年前写的,而 nvelocity 2003 年后就停止更新了, http://nvelocity.sourceforge.net/index.html,肯定无法适应当前 .net 运行时的变化了。至于哪一种 .net 模板比较好,我就没进行过比较了。
Alan,
幸会, 在这里,你们现在用什么 .net 模板?
难道不应该使用RazorEngine吗?
RazorEngine 最近都有更新
在网上搜.net模板,竟然搜到了你的博客,哈哈哈