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); } }
而後在項目裏,添加一個文件夾而且命名爲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 /> 密 碼:<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>
直接運行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; } }
而後,在處理的.ashx文件中初始化模板與輸入:
Person p = new Person(); p.name = "Dragon"; p.age = "11111"; //傳入模板所須要的參數 vltContext.Put("p", p);
在.htm文件中調用對象:
用戶名:<input type="text" name="username" value= "$p.name" /><br /> 年 齡:<input type="text" name="password" value= "$p.age" /><br />
三、對象的索引
在.ashx文件初始化模板與輸入:
Dictionary<string,string> dict = new Dictionary<string,string>(); dict["name"] = "Dragon"; dict["address"] = "guangxi"; //傳入模板所須要的參數 vltContext.Put("dict", dict);
在.htm文件中調用對象:
$dict.name<br /> $dict.address
四、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" });
格式:
#foreach($element in $list)
This is $element
#end
在.htm文件中調用對象:
<ul> #foreach($p in $lstps) <li>$p.name,$p.age</li> #end </ul>
在前臺的模版中,有關後臺代碼的編寫,若是以#開頭,好比#foreach ,由於沒有大括號的約束,因此結束時以#end爲標識,ForEach和If還能夠嵌套使用,就像平時咱們寫後臺代碼的那樣,只是語法稍稍有點不一樣而已。
五、IF判斷
在.ashx文件初始化模板與輸入:
//數組 string[] strs = {"Dragon","guangxi","web"}; //傳入模板所須要的參數 vltContext.Put("strs", strs);
在.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>
六、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>
使用匿名類來進行代碼封裝
對於Nvelocity咱們的重點應該是放在編寫適合需求的模板,後臺的代碼基本上是一次封裝,屢次調用便可了,只須要把要Put的對象作成一個可變參數,剩餘的代碼進行一個封裝就好了,那麼如何更好的調用,我建議使用匿名類,由於隨着模板的編寫,咱們可能須要傳遞多種、多個數據,使用匿名類的好處就是,類屬性自定義而不用像自定義一個類型那樣,每次增長數據屬性就得去修改一下類型,這樣顯得很優雅很隨性簡便。
//匿名類 var models = new { head = new { title = "匿名類測試",head = "系統" }, foot = new { content = "技術支持:Dragon" } };