A、nVelocity是一個基於.NET的模板引擎(template engine)。它允許任何人僅僅簡單的使用模板語言(template language)來引用由.NET代碼定義的對象。頁面設計人員可以只關注頁面的顯示效果,而由.NET程序開發人員關注業務邏輯編碼。
B、模板引擎處理流程:編寫模板->處理數據->渲染HTML。
C、Nvelocity下載地址:http://www.castleproject.org/download/
D、一個簡單的示例:
新建一個Application,在項目中添加Nvelocity的引用,然后添加新建項,選擇一般處理程序,命名為login.ashx,在ProcessRequest方法里寫下面代碼:
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,代碼:
<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一個對象、集合呢?
1、基本用法
vltContext.Put("username", username);
在模板中可以通過$username來引用
<input type="text" name="username" value="$username" />
2、對象的屬性
下面演示一些更加高級的用法,直接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 />
3、對象的索引
在.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
4、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還可以嵌套使用,就像平時我們寫后台代碼的那樣,只是語法稍稍有點不同而已。
5、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>
6、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。
7、使用#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" } };
