ASP.NET 模板引擎 - NVelocity
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版本
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动画演示--------------------------------------------------------
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 父亲的姓名: $p.Father.Name<br />
我的年龄是: $p.Age 我的姓名: $p.Name<br />
</body>
</html>
----------------------------------------------Gif动画演示----------------------------------------------------------
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动画演示----------------------------------------------------------
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动画演示----------------------------------------------------------
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中即可显示出对象属性值:
总结: 以上为NVelocity的用法,以及HTML模板中对一般处理程序中对象调用方法。
附件: NVelocity DLL Demo下载
ASP.NET 模板引擎 - NVelocity的更多相关文章
- C#模板引擎NVelocity实战项目演练
一.背景需求 很多人在做邮件模板.短信模板的时候,都是使用特殊标识的字符串进行占位,然后在后台代码中进行Replace字符串,如果遇到表格形式的内容,则需要在后台进行遍历数据集合,进行字符串的拼接,继 ...
- 模板引擎Nvelocity实例
前言 最近一直忙于工作,没时间来管理博客,同时电脑也不给力,坏了一阵又一阵,最后还是去给修理了,这不刚一回来迫不及待的就写一篇文章来满足两个月未写博客的紧迫感. Nvelocity 关于nveloci ...
- 好用的模板引擎NVelocity
CastleNVelocity-1.1.1,使用方法: 把dll放到项目中,添加引用,修改配置的文件夹以及数据模型,最后在逻辑代码中调用即可. 封装到CommonHelper.cs using Sys ...
- asp .net 模板引擎 使用 Razor 生成html静态页面
刚开始不是理解 写完之后 觉得还蛮简单的 分为这几个步骤 1.获取页面模板Html 2.获取数据 3.解析模板和数据,生成静态页Html代码 4.生成静态文件 模板形式是mvc的模式,会mvc 看一下 ...
- Asp.net动态页面静态化之初始NVelocity模板引擎
Asp.net动态页面静态化之初始NVelocity模板引擎 静态页面是网页的代码都在页面中,不须要运行asp,php,jsp,.net等程序生成client网页代码的网页,静态页面网址中一般不含&q ...
- 【转】NVelocity模板引擎初学总结
转自:http://sunxitao88.blog.163.com/blog/static/68314439200861963326251/ 前不久,接触到.NET下的MVC-MonoRail,它推荐 ...
- Nvelocity模板引擎开发网页
在ASP.NET网站开发中,我们要做许多的网页,如果多个网页的内容框架有些重复使用,我们用NVelocity模板引擎,就可以把相同的部分html代码单独放在一个文件中就行了,当要使用的时候,只需使用# ...
- Asp.net MVC Razor模板引擎技巧分享
Razor是Asp.net MVC中新的默认模板类型, 语法简单易用.这篇文章不涉及Razor的语法,主要介绍Razor的一些在MVC项目中的使用技巧,以及脱离MVC环境下,如何使用Razor. 阅读 ...
- 关于html、asp、php模板引擎、aspnet mvc、REST的一点思考
先看我对REST的一点认识,下面是<rest实战> 这本书的序言文字: 在我刚刚开始从事解决计算问题的时候,业界就有很多人有一个愿望:将系统设计为能够被自由组合的组件.互联网(I ...
随机推荐
- 计算两个日期相隔的天数(jodd)
public static void main(String[] args) throws ParseException { System.out.println(TimeUtil.dayOfYear ...
- [置顶] 很荣幸被选为2013年度 CSDN博客之星评选,如果觉得我的文章可以,请投我一票!
亲爱的小伙伴们,很荣幸我被选为<2013年度CSDN博客之星候选人>,希望大家多多支持,geekguy会继续努力,为大家奉献更好的文章. 投票地址:http://vote.blog.csd ...
- 剑指OFFER之二进制中1的个数(九度OJ1513)
题目描述: 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 输入: 输入可能包含多个测试样例.对于每个输入文件,第一行输入一个整数T,代表测试样例的数量.对于每个测试样例输入为一个整 ...
- PostgreSQL中如何查询在当前的哪个数据库中
[pgsql@localhost bin]$ ./psql -d tester psql () Type "help" for help. tester=# select curr ...
- Python的包管理工具Pip
接触了Ruby,发现它有个包管理工具RubyGem非常好用,而且有非常完备的文档系统http://rdoc.info 发现Python下也有相同的工具,包含easy_install和Pip.只是,我没 ...
- Binder机制1---Binder原理介绍
1.Binder通信机制介绍 这篇文章会先对照Binder机制与Linux的通信机制的区别,了解为什么Android会另起炉灶,採用Binder.接着,会依据Binder的机制,去理解什么是Servi ...
- Nginx目录保护、防盗链、限速及多域名处理
http://www.opsers.org/server/nginx-directory-protection-anti-hotlinking-processing-speed-and-multi-d ...
- PHP: 深入pack/unpack 字节序
http://my.oschina.net/goal/blog/195749?p=1 目录[-] 写在前面的话 什么是字节序 MSB和LSB 大端序 小端序 网络字节序 主机字节序 总结 pack/u ...
- laraval框架model注意事项
今天创建了一个model,名字叫做Role_Users.php,结果运行的时候死活不识别,后来发现去掉名字中的下划线就可以识别了,虽然解决了,但还是不明白原理,若有大神看到但求解答
- Understanding Spring Web Application Architecture: The Classic Way--转载
原文地址:http://www.petrikainulainen.net/software-development/design/understanding-spring-web-applicatio ...