Nvelocity模板引擎


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);
            }
        }
View Code

   然后在項目里,添加一個文件夾並且命名為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 />&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一個對象、集合呢?

  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; }
    }
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

   3、對象的索引

  在.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

  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" });
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還可以嵌套使用,就像平時我們寫后台代碼的那樣,只是語法稍稍有點不同而已。

   5、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

  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>
View Code

   使用匿名類來進行代碼封裝

     對於Nvelocity我們的重點應該是放在編寫適合需求的模板,后台的代碼基本上是一次封裝,多次調用即可了,只需要把要Put的對象做成一個可變參數,剩余的代碼進行一個封裝就行了,那么如何更好的調用,我建議使用匿名類,因為隨着模板的編寫,我們可能需要傳遞多種、多個數據,使用匿名類的好處就是,類屬性自定義而不用像自定義一個類型那樣,每次增加數據屬性就得去修改一下類型,這樣顯得很優雅很隨性簡便。

//匿名類
var models = new { head = new { title = "匿名類測試",head = "系統" }, foot = new { content = "技術支持:Dragon" } };
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM