ASP.NET 一般处理程序基础2(Nvelocity模板引擎用法)
Person person = new Person();
person.Name = "yzk";
person.Age = 30;
Person dad = new Person();
dad.Name = "ywx";
dad.Age = 60;
person.Father = dad;
在html模板中可以这样取值<p>我的老爹是 $p.Father.Name,他的年龄是$p.Father.Age </p>
19、Nvelocity的特性,如果建立的对象是个索引,还可以把索引当做它的值。
Dictionary<string,string> dict=new Dictionary<string,string>();//建一个Dictionary键值对
dict["tom"]="斯坦福";
dict["jim"]="加里敦";
dict["yzk"]="哈佛"; //把Dictionary扔给模板引擎
VelocityEngin vltEngine=new VelocityEngine(); vltEngine.SetProperty(RuntimeConstants.RESOURCE_LOADER,"file"); vltEngine.SetProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH,System,Web.Hosting.HostingEnvironment.MapPath("~/templates")); vltEngine.Init(); VelocityContext vltContext=new VelocityContext(); vltContext.Put("ps",dict);//这里改成使用字典 Template vltTemplate=vltEngine.GetTemplates("test3.htm"); System.IO.StringWriter.vltWriter=new System.IO.StringWriter(); vltTemplate.Merge(vltContext,vltWriter);//用GastleNvelocity1.11版本的就不会报错了 string html=vltWriter.GetStringBuilder().ToString(); context.Response.Write(html);
--------------------------------test3.htm
<p>$ps.tom;</p> 可以得到斯坦福
20、Nvelocity的深入,可以对对象进行foreach
C#基本语法
string[] strs=new string[]{"dsdsds",sresfs"};
foreach(string s in strs)
{
Console.WriteLine(s);
}
-------------------------------可以类似于这样的遍历
string[] strs=new string[]{"黄继光","古天乐","张靓颖"};
vltContext.Put("mingrens",strs);
-----------------------------------------------
List<Person> persons=new List<Person>();//用前面定义好的那个Person类
persons.Add(new Person{Age=30,Name="林华丽"});
persons.Add(new Person{Age=10,Name="王二小"});
persons.Add(new Person{Age=20,Name="刘德华"});
vltContext.Put("psersons",persons);
...........................
-------------------------test3.htm里面
<body>
#foreach($mr in $mingrens)
<li>$mr</li>
#end
</body> //这就是对集合进行遍历然后输出的方法
----------------------------------------------------------
<body>
#foreach($mr in $mingrens)
<li>$p.Name的年龄是$p.Age</li>
#end
</body> //这就是对集合进行遍历然后输出的方法
21、可以在NVelocity中用if else判断
#if($age>10)
大于10
#else
小于10
#end
----------------------------------
<ul>
#foreach($p in $persons)
#if($p.Age>20)
<li style="color:Red">$p.Name的年龄是$p.Age</li>
#else
<li style="color:Green">$p.Name的年龄是$p.Age</li>
#end
#end
</ul>
22、Nvelocity的包含,类似于母版页,所有的页面中都调用这个,包含头尾,和母版一样用。
--------------------------------head.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> <p><h1>欢迎光临$age</h1></p> #if($age>30) hahaha #end
-------------------------------foot.htm
#if($age<10) hahaha #end <p>本网站版权所有$age</p> </body> </html>
-------------------------------test3.htm
#include("head.htm");
....................
#include("foot.htm");
-------------------------------guanggao.htm可以加个广告,不光是头尾
<a href="http://www.baidu.com">点击加载
#include("guanggao.htm");
************************************************************************************
除了include还有个叫parse可以将include替换掉,作用和效果是一样的,但是有区别。
include元素只是把页面内容包含进来,并不会解析其中的Nvelocity元素,而parse会解析其中的元素
也就是说早head.htm或者foot.htm中加入$p.name不会include不会解析,parse会解析
23、对Nvelocity进行封装
用C#中提供的匿名类来解决这个问题
----------------------------------------displayNews.htm
<body>
<h1>$title</h1>
<p>作者:$author;发布日期:$postdate</p>
<p>$msg</p>
</body>
---------------------------------------DisplayNews.ashx
vltContext.Put("title","sfdsds");
vltContext.Put("author","sfdsds");
vltContext.Put("person","sfdsds");
vltContext.Put("age","sfdsds");//这样要put四个变量
******************************************怎么解决
<body>
<h1>$data.Title</h1>
<p>作者:$data.Tuthor;发布日期:$data.Tostdate</p>
<p>$data.Msg</p>
</body>
-----------------------------------定义匿名类//所谓的匿名类其实就是编译器自动帮你生成的一
个类,其实还是一个正常的类
var news=new{Tile="特大喜讯",Author="刘德华",PoseDate="2013-11-08",Msg="今晚上会公布喜讯
细节!"};//把类的定义和对象的声明初始化放到一起
string s=news.PostDate;//News是累的一个对象,一个类既然继承object那么直接可以点出来了
匿名类的好处是,随new随用,用完就扔了
vltContext.Put("data",news);//把匿名类的对象放进去
public void ProcessRequest(HttpContext context) { context.Response.ContentType = "text/html"; VelocityEngine vltEngine = new VelocityEngine(); vltEngine.SetProperty(RuntimeConstants.RESOURCE_LOADER, "file"); vltEngine.SetProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH,System.Web.Hosting.HostingEnvironment.MapPath("~/templates"));
//模板文件所在的文件夹 vltEngine.Init(); //把类的定义和对象的声明初始化放到一起 //匿名类 var news = new { Title = "特大喜讯",Author="杨中科",PostDate="2013-11-08",Msg="今天晚上会公布喜讯细节!" }; string s = news.PostDate; VelocityContext vltContext = new VelocityContext(); vltContext.Put("data", news); Template vltTemplate = vltEngine.GetTemplate("displayNews1.htm"); System.IO.StringWriter vltWriter = new System.IO.StringWriter(); vltTemplate.Merge(vltContext, vltWriter); string html = vltWriter.GetStringBuilder().ToString(); context.Response.Write(html); }
也可以定义一个Nvelocity类简化代码:
public static string RenderHtml(string name, object data) { VelocityEngine vltEngine = new VelocityEngine(); vltEngine.SetProperty(RuntimeConstants.RESOURCE_LOADER, "file"); vltEngine.SetProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, System.Web.Hosting.HostingEnvironment.MapPath("~/templates"));//模板文件所在的文件夹 vltEngine.Init(); VelocityContext vltContext = new VelocityContext(); vltContext.Put("Model", data);//设置参数,在模板中可以通过$data来引用 Template vltTemplate = vltEngine.GetTemplate(name); System.IO.StringWriter vltWriter = new System.IO.StringWriter(); vltTemplate.Merge(vltContext, vltWriter); return vltWriter.GetStringBuilder().ToString(); }