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
相關文章
相關標籤/搜索