Nvelocity模板引擎

A、nVelocity是一个基于.NET的模板引擎(template engine)。它容许任何人仅仅简单的使用模板语言(template language)来引用由.NET代码定义的对象。页面设计人员能够只关注页面的显示效果,而由.NET程序开发人员关注业务逻辑编码。html

B、模板引擎处理流程:编写模板->处理数据->渲染HTML。web

C、Nvelocity下载地址:http://www.castleproject.org/download/数组

D、一个简单的示例:浏览器

  新建一个Application,在项目中添加Nvelocity的引用,而后添加新建项,选择通常处理程序,命名为login.ashx,在ProcessRequest方法里写下面代码:ide

        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/html";

            //是否载入
            string ispostback = context.Request["ispostback"];
            if (string.IsNullOrEmpty(ispostback))
            {
                //建立NVelocity实例对象
                VelocityEngine vltEngine = new VelocityEngine();
                vltEngine.SetProperty(RuntimeConstants.RESOURCE_LOADER, "file");

                //模板存放目录
                vltEngine.SetProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, HostingEnvironment.MapPath("/template"));
                vltEngine.Init();

                //定义一个模板上下文
                VelocityContext vltContext = new VelocityContext();

                //传入模板所须要的参数
                vltContext.Put("username", "");
                vltContext.Put("password", "");
                vltContext.Put("msg", "载入");

                //获取咱们刚才所定义的模板,上面已设置模板目录
                Template vltTemplate = vltEngine.GetTemplate("login.htm");

                //根据模板的上下文,将模板生成的内容写进刚才定义的字符串输出流中
                StringWriter vltWriter = new StringWriter();
                vltTemplate.Merge(vltContext, vltWriter);
                string html = vltWriter.GetStringBuilder().ToString();
                context.Response.Write(html);
            }
        }
View Code

   而后在项目里,添加一个文件夹而且命名为template,做为存放模板的目录,这与上面代码里设置的模板目录要对应一致,而后添加新建项,选择HTML页,命名为login.htm,代码:post

<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    <title>登陆</title>
</head>
<body>
<form action="../login.ashx">
用户名:<input type="text" name="username" value="$username" /><br />&nbsp;&nbsp;&nbsp; 码:<input type="text" name="password"  value="$password" /><br />
<input type="hidden" name="ispostback" value="true" />
<input type="submit" value="提交"/>
<p>$msg</p>
</form>
</body>
</html>
View Code

   直接运行HTML确定只能看到模板的效果而已,咱们工做的原理是,在通常处理程序ashx中读取模板来生成HTML,而且输出给客户端浏览器,因此咱们要访问的应该是通常处理程序ashx。测试

E、Nvelocity模板语法网站

      后台代码基本就是那样了,对于Nvelocity的重点应该是如何去编写适合需求的模板,上面的例子Put的时候,都是以字符串为例的,那么,假如Put一个对象、集合呢?ui

  一、基本用法 编码

  vltContext.Put("username", username);
     在模板中能够经过$username来引用 

  <input type="text" name="username" value="$username" />

  二、对象的属性

  下面演示一些更加高级的用法,直接Put一个对象,而后在模版中引用其属性。Nvelocity还能够支持对象的属性是对象的调用方法,引用的时候就比如$p.Name。

  先定义一个C#类,Person.cs

public class Person
    {
        public string name{ get; set; }
        public string age { get; set; }
    }
View Code

  而后,在处理的.ashx文件中初始化模板与输入:

Person p = new Person();
p.name = "Dragon";
p.age  = "11111";

//传入模板所须要的参数
vltContext.Put("p", p);
View Code

  在.htm文件中调用对象:

用户名:<input type="text" name="username" value= "$p.name" /><br />&nbsp;&nbsp;&nbsp; 龄:<input type="text" name="password"  value= "$p.age" /><br />
View Code

   三、对象的索引

  在.ashx文件初始化模板与输入:

Dictionary<string,string> dict = new Dictionary<string,string>();
dict["name"] = "Dragon";
dict["address"]  = "guangxi";

//传入模板所须要的参数
vltContext.Put("dict", dict);
View Code

  在.htm文件中调用对象:

$dict.name<br />
$dict.address
View Code

  四、ForEach遍历  

  用List方式

  在.ashx文件初始化模板与输入:

//List类型
List<Person> lstps = new List<Person>();
lstps.Add(new Person{ name = "Dragon",age = "30"});
lstps.Add(new Person{ name = "YYK", age = "28" });
View Code

  格式:

  #foreach($element in $list)

    This is $element

  #end

  在.htm文件中调用对象:

<ul>
#foreach($p in $lstps)
    <li>$p.name,$p.age</li>
#end
</ul>
View Code

  在前台的模版中,有关后台代码的编写,若是以#开头,好比#foreach ,由于没有大括号的约束,因此结束时以#end为标识,ForEach和If还能够嵌套使用,就像平时咱们写后台代码的那样,只是语法稍稍有点不一样而已。

   五、IF判断

  在.ashx文件初始化模板与输入:

//数组
string[] strs = {"Dragon","guangxi","web"};
//传入模板所须要的参数
vltContext.Put("strs", strs);
View Code

  在.htm文件中调用对象:

  格式:

  #if(condition)
  #elseif(condition)
  #else
  #end

<ul>
#foreach($str in $strs)
    #if ($str == "Dragon")
    <li>$str</li>
    #elseif($str == "guangxi")
    <li>$str</li>
    #end
#end
</ul>
View Code

  六、Parse和Include 

  顾名思义,#include就是在模版中在将其余模版包括进来,就比如网站的头部,尾部,广告模版等等,这些内容都是相同的时候,就能够作成一个单独的模版供各处引用。

  #parse的用法跟#include相相似,若是将上面的代码改为#parse以后,效果是同样的,#parse的特殊功能在于,它能够解析Nvelocity元素,好比,body.html 模版使用Nvelocity变量  $body ,若是使用#parse引用head.html和footer.html两个模版,则在head.html、footer.html模版中继续可使用$body这个变量,而#include作不到,而且相关的Nvelocity元素(#foreach、#if)也不起效果,只能原样输出,因此#parse > #inclued。

   七、使用#set

  前台的Nvelocity代码中,根据须要,咱们能够声明一个供前台使用的参数,这样就省得后台代码再次传递过来了,对于一些简单逻辑,咱们能够这样实现

  在.htm文件中调用对象:

#set($a=1+6)
<p style="text-align:center">A的值是:$a</p>
View Code

   使用匿名类来进行代码封装

     对于Nvelocity咱们的重点应该是放在编写适合需求的模板,后台的代码基本上是一次封装,屡次调用便可了,只须要把要Put的对象作成一个可变参数,剩余的代码进行一个封装就好了,那么如何更好的调用,我建议使用匿名类,由于随着模板的编写,咱们可能须要传递多种、多个数据,使用匿名类的好处就是,类属性自定义而不用像自定义一个类型那样,每次增长数据属性就得去修改一下类型,这样显得很优雅很随性简便。

//匿名类
var models = new { head = new { title = "匿名类测试",head = "系统" }, foot = new { content = "技术支持:Dragon" } };
View Code
相关文章
相关标签/搜索