ASP.NET 模板引擎 - NVelocity

时间:2022-11-07 18:05:32

1,HTML的Form表单数据按Button提交数据以后,由 Action 指定的服务器端处理程序(.ashx)进行处理后 ,再响应的浏览器。

2,我们把 HTML的表单,写到 .ashx 一般处理程序页面中,这样就一般处理程序页面就可以显示 Form表单登陆,并且可以处理是否登陆成功的逻辑部分,

 也就是把前台显示和后天业务逻辑拼到了一起,如下:

 public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/html"; //渲染一个Form表单
context.Response.Write("<html>");
context.Response.Write("<head>一般处理程序登陆页面</head><body><form action='login.ashx' action='get'><br/><br/>"); //
context.Response.Write("用户名:<input type='text' name='UserName' /><br/>");
context.Response.Write("密码:<input type='password' name='Pwd' /><br/>");
context.Response.Write("提交:<input type='submit' /><br/>"); string strUserName = context.Request.QueryString["UserName"];
string strPwd = context.Request.QueryString["Pwd"];
if (string.IsNullOrEmpty(strUserName) == false) //登陆名不为空的时候,检查密码是否正确
{
if (strUserName == "admin" && strPwd == "")
{
context.Response.Write("恭喜您,登陆成功");
}
else
{
context.Response.Write("登陆失败");
}
}
}

  但是这样去做,网页表单样式等 只有通过这种修改 .ashx一般处理程序的方法去修改。

  没法给前台美工可以处理的地方,另外如果后天业务逻辑复杂的话,这样的整合就更复杂了。

  如果有一个文件 又可以区分前台显示和后台业务逻辑 这样就好了。

3,nVelocity是一个基于.NET的模板引擎(template engine)。它允许任何人仅仅简单的使用模板语言(template language)来引用由.NET代码定义的对象

4,nVelocity,下载网址:NVelocity - A .Net Template Engine ,下载后把 dll文件放到项目中,然后 引用添加对dll的引用,注意对应的 .NET Framework版本

ASP.NET 模板引擎 - NVelocity

6, Login_NVelocity.html和Login_NVelocity.ashx代代码分别如下:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>一般处理程序登陆页面</title>
</head>
<body>
<form action="Login_NVelocity.ashx" method="get">
用户名:<input type="text" name="UserName" value="$name" /><br />
密码:<input type="password" name="password" value="$pwd" /><br />
提交:<input type="submit" /><br />
<p>$message</p>
</form>
</body>
</html>

Login_NVelocity.ashx :  一般处理程序页面实现了对HTML模板页面中变量的控制  $name, $pwd,$message

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using NVelocity;
using NVelocity.App;
using Commons.Collections;
using NVelocity.Runtime;
using System.IO; namespace HttpHandler
{
/// <summary>
/// LoginNVelocity 的摘要说明
/// </summary>
public class LoginNVelocity : IHttpHandler
{ public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/html"; string strUserName = context.Request["username"];
string strPwd = context.Request["password"];
string strMsg = context.Request["message"]; string strHtml = "";
if (string.IsNullOrEmpty(strUserName) && string.IsNullOrEmpty(strPwd))
{
strHtml = Template_Nvelocity("", "", "");
}
else if (strUserName == "admin" && strPwd == "")
{
strMsg = "恭喜您,登陆成功!";
context.Response.Write(strMsg);
}
else
{
strMsg = "登陆失败,用户名或者密码错误";
strHtml = Template_Nvelocity(strUserName, strPwd, strMsg);
}
//输出
context.Response.Write(strHtml); }
//模板引擎方法,传递 登录名、登陆密码、登陆是否成功 这三个变量
public string Template_Nvelocity(string strUserName, string strPwd, string strMsg)
{ //创建NVlecocity模板引擎的实例对象
VelocityEngine vlEngine = new VelocityEngine(); //初始化实例对象,定义对象的部分属性
ExtendedProperties props = new ExtendedProperties();
props.AddProperty(RuntimeConstants.RESOURCE_LOADER, "file");//声明模板是在file中
props.AddProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, System.Web.Hosting.HostingEnvironment.MapPath("~/")); //指定模板文件所在文件夹
vlEngine.Init(props); //替换模板中的数据
VelocityContext vltContext = new VelocityContext();
//vltContext.Put("data", data); //设置参数,在模板中可以通过$Data读取数据
vltContext.Put("name", strUserName);
vltContext.Put("pwd", strPwd);
vltContext.Put("message", strMsg); //从文件中读取模板
Template VltTemp = vlEngine.GetTemplate("Login_NVelocity.html");
//合并模板
StringWriter writer = new StringWriter();
VltTemp.Merge(vltContext, writer); //转化为字符串
string html = writer.GetStringBuilder().ToString(); return html;
} public bool IsReusable
{
get
{
return false;
}
}
}
}

------------------------------------------------gif动画演示--------------------------------------------------------

ASP.NET 模板引擎 - NVelocity

7,项目中新添加一个Person类,我们就可以通过NVolecity 把Person类的属性 在模板中进行调用、显示

  A.添加Person类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web; namespace HttpHandler
{
public class Person
{
public string Name { get; set; } //姓名
public int Age { get; set; } //年龄 public Person Father { get; set; } //父亲
}
}

B.添加一般处理程序 Person_Class_NVelocity.ashx ,把Person对象的属性 通过模板引擎 传递到Person.html页面中

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using NVelocity;
using NVelocity.App;
using Commons.Collections;
using NVelocity.Runtime;
using System.IO; namespace HttpHandler
{
/// <summary>
/// Person_Class_NVelocity 的摘要说明
/// </summary>
public class Person_Class_NVelocity : IHttpHandler
{ public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/html"; Person me = new Person();
me.Name = "Peter";
me.Age = ; Person Dad = new Person();
Dad.Name = "Da Peter";
Dad.Age = ; me.Father = Dad; string strHtml = Template_Nvelocity_P(me); //输出
context.Response.Write(strHtml);
} //模板引擎方法
public string Template_Nvelocity_P(Person per)
{ //创建NVlecocity模板引擎的实例对象
VelocityEngine vlEngine = new VelocityEngine(); //初始化实例对象,定义对象的部分属性
ExtendedProperties props = new ExtendedProperties();
props.AddProperty(RuntimeConstants.RESOURCE_LOADER, "file");//声明模板是在file中
props.AddProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, System.Web.Hosting.HostingEnvironment.MapPath("~/")); //指定模板文件所在文件夹
vlEngine.Init(props); //替换模板中的数据
VelocityContext vltContext = new VelocityContext();
//vltContext.Put("data", data); //设置参数,在模板中可以通过$Data读取数据
vltContext.Put("p", per); //从文件中读取模板
Template VltTemp = vlEngine.GetTemplate("Person.html");
//合并模板
StringWriter writer = new StringWriter();
VltTemp.Merge(vltContext, writer); //转化为字符串
string html = writer.GetStringBuilder().ToString(); return html; } public bool IsReusable
{
get
{
return false;
}
}
}
}

  C.Person.html页面中直接调用传递过来的Person对象的属性

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
</head>
<body>
父亲的年龄是: $p.Father.Age &nbsp; 父亲的姓名: $p.Father.Name<br />
我的年龄是: $p.Age &nbsp; 我的姓名: $p.Name<br />
</body>
</html>

----------------------------------------------Gif动画演示----------------------------------------------------------

ASP.NET 模板引擎 - NVelocity

8, HTML中直接通过 对象的索引访问对象

  A.添加City_Class_NVelocity.ashx一般处理程序,定义Diationary 键值对并设置对应的值

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using NVelocity;
using NVelocity.App;
using Commons.Collections;
using NVelocity.Runtime;
using System.IO; namespace HttpHandler
{
/// <summary>
/// City_Class_NVelocity 的摘要说明
/// </summary>
public class City_Class_NVelocity : IHttpHandler
{ public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/html"; //定义键值对
Dictionary<string, string> dict = new Dictionary<string, string>();
dict["BJ"] = "北京";
dict["SH"] = "上海";
dict["GZ"] = "广州"; string strHtml = Template_Nvelocity_C(dict); context.Response.Write(strHtml);
} //模板引擎方法
public string Template_Nvelocity_C(Dictionary<string, string> dict)
{ //创建NVlecocity模板引擎的实例对象
VelocityEngine vlEngine = new VelocityEngine(); //初始化实例对象,定义对象的部分属性
ExtendedProperties props = new ExtendedProperties();
props.AddProperty(RuntimeConstants.RESOURCE_LOADER, "file");//声明模板是在file中
props.AddProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, System.Web.Hosting.HostingEnvironment.MapPath("~/")); //指定模板文件所在文件夹
vlEngine.Init(props); //替换模板中的数据
VelocityContext vltContext = new VelocityContext();
//vltContext.Put("data", data); //设置参数,在模板中可以通过$Data读取数据
vltContext.Put("c", dict); //从文件中读取模板
Template VltTemp = vlEngine.GetTemplate("City.html");
//合并模板
StringWriter writer = new StringWriter();
VltTemp.Merge(vltContext, writer); //转化为字符串
string html = writer.GetStringBuilder().ToString(); return html; } public bool IsReusable
{
get
{
return false;
}
}
}
}

  B.添加City.html, html中通过$c.BJ 来访问 .ashx中定义的对象属性

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
</head>
<body>
索引获得一般处理程序中的键、值对:<br />
c.BJ= $c.BJ<br />
c.SH= $c.SH<br />
c.GZ= $c.GZ<br />
</body>
</html>

----------------------------------------------Gif动画演示----------------------------------------------------------

ASP.NET 模板引擎 - NVelocity

9,对集合进行遍历   #foreach($item in $list)  ... #end

City_Class_NVelocity.ashx 中添加 string 数组 和 泛型后,在HTML模板中 遍历读取属性值:

  分别更新,City_Class_NVelocity.ashx和City.html如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using NVelocity;
using NVelocity.App;
using Commons.Collections;
using NVelocity.Runtime;
using System.IO; namespace HttpHandler
{
/// <summary>
/// City_Class_NVelocity 的摘要说明
/// </summary>
public class City_Class_NVelocity : IHttpHandler
{ public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/html"; //定义键值对
Dictionary<string, string> dict = new Dictionary<string, string>();
dict["BJ"] = "北京";
dict["SH"] = "上海";
dict["GZ"] = "广州"; string strHtml = Template_Nvelocity_C(dict); context.Response.Write(strHtml);
} //模板引擎方法
public string Template_Nvelocity_C(Dictionary<string, string> dict)
{ //定义数组
string[] strs = new string[] { "字符串11111", "字符串22222", "字符串33333" };
//定义泛型 Person对象
List<Person> persons = new List<Person>();
persons.Add(new Person { Name = "习大大", Age = });
persons.Add(new Person { Name = "彭妈妈", Age = }); //创建NVlecocity模板引擎的实例对象
VelocityEngine vlEngine = new VelocityEngine(); //初始化实例对象,定义对象的部分属性
ExtendedProperties props = new ExtendedProperties();
props.AddProperty(RuntimeConstants.RESOURCE_LOADER, "file");//声明模板是在file中
props.AddProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, System.Web.Hosting.HostingEnvironment.MapPath("~/")); //指定模板文件所在文件夹
vlEngine.Init(props); //替换模板中的数据
VelocityContext vltContext = new VelocityContext();
//vltContext.Put("data", data); //设置参数,在模板中可以通过$Data读取数据
vltContext.Put("c", dict);
//添加数组和泛型参数
vltContext.Put("str", strs);
vltContext.Put("per", persons); //从文件中读取模板
Template VltTemp = vlEngine.GetTemplate("City.html");
//合并模板
StringWriter writer = new StringWriter();
VltTemp.Merge(vltContext, writer); //转化为字符串
string html = writer.GetStringBuilder().ToString(); return html; } public bool IsReusable
{
get
{
return false;
}
}
}
}
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
</head>
<body>
索引获得一般处理程序中的键、值对:<br />
c.BJ= $c.BJ<br />
c.SH= $c.SH<br />
c.GZ= $c.GZ<br /> <br /> foreace遍历读取字符串数组中的数据:
<ul>
#foreach($s in $str)
<li>$s</li>
#end
</ul>
<br />
foreace遍历读取泛型Person中的数据:
<ul>
#foreach($p in $per)
<li>$p.Name的年龄是$p.Age</li>
#end
</ul>
</body>
</html>

----------------------------------------------Gif动画演示----------------------------------------------------------

ASP.NET 模板引擎 - NVelocity

10,条件语句: #if() #else if() #end ,并且可以嵌套到ForEach中, 例如把上面city.html一段foreach代码中添加 if条件语句:

 <ul>
#foreach($p in $per)
#if($p.Age>30)
<li style="color: red">$p.Name的年龄是$p.Age</li>
#else
<li style="color: black">$p.Name的年龄是$p.Age</li>
#end
#end
</ul>

11,模板中调用其他模板 用 #include

  A. 项目中添加两个模板文件: head.html 和 foot.html

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
</head>
<body>
<b>网站Head部分</b><br /><br />
<b>网站底部Foot部分,版权声明</b>
</body>
</html>

  B. #include("head.html") 这样就可以引用模板文件了

#include("head.html")

    索引获得一般处理程序中的键、值对:<br />
c.BJ= $c.BJ<br />
c.SH= $c.SH<br />
c.GZ= $c.GZ<br /> <br /> foreace遍历读取字符串数组中的数据:
<ul>
#foreach($s in $str)
<li>$s</li>
#end
</ul>
<br />
foreace遍历读取泛型Person中的数据:
<ul>
#foreach($p in $per)
#if($p.Age>30)
<li style="color: red">$p.Name的年龄是$p.Age</li>
#else
<li style="color: black">$p.Name的年龄是$p.Age</li>
#end
#end
</ul> #include("foot.html")

12,#parse, 除了实现调用其他模板功能以外 还可以解析NVelocity中的对象的属性。

  A. 更新Head.html , 直接调用.ashx中的对象

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
</head>
<body>
<b>网站Head部分</b><br />
<b>Parse,除了实现Include的包含功能,还可以解析 NVelocity中的元素的值,如 c.BJ=$c.BJ</b> <br /> <br />

  B.city.html中即可显示出对象属性值:

ASP.NET 模板引擎 - NVelocity

总结: 以上为NVelocity的用法,以及HTML模板中对一般处理程序中对象调用方法。

附件: NVelocity DLL    Demo下载