文章出處

Razor模板引擎不僅在ASP.NET MVC中內置了Razor模板引擎,還有一個開源的RazorEngine,

這樣以來我們可以在非ASP.NET MVC項目中使用Razor引擎,甚至在控制臺,WinForm項目中都可以使用。

 

 

文件的創建

文件是一個后綴名為cshtml的文件,如果在非MVC項目中創建Razor文件,可以新建一個html,把后綴名該為cshtml。

 


 

RazorEngine使用初體驗

一、前臺:

二、后臺代碼

解釋:

使用RazorEngine需提前在項目中引入它的程序集文件dll。

后臺代碼首先獲得cshtml文件將其讀成文本文件,在通過Razor.Parse將文本解析為,含義為Razor的模板,將其展出。訪問的話應訪問代碼頁面,cshtml只是一個展示模板,等待代碼動態繪制內容使用cshtml模板展示.

 


 

 

Razor.Parse()方法

1.通過第二個參數,可以傳一個object類型的對象,到前臺(cshtml)模板。

string razor = RazorEngine.Razor.Parse(html, new { name = "zs", age = 12 });

注意:傳入對象的訪問權限,需為public

前臺輸出這個對象的值:

    <h1>@Model.name</h1>

    <h2>@Model.age</h2>  

 


RazorEngine原理

1.net在編譯的時候會把.cshtml文件生成一個動態程序集,每次調用,就會每次生成一個不重復的動態程序集,這樣看出會給服務器造成不容小視的壓力。

解決辦法:

Razor.Parse()方法的第三個參數cacheName

 

如果傳入一個cacheName(名字隨意),一旦編譯成功,下次會使用緩存,不會重復生成新的動態程序集。

 

2.關于cacheName的問題

從上面的原理得知,如果給Razor.Parse()傳入cacheName,下次調用可以使用緩存,那么會產生一個問題,cshtml文件如果發生了修改,如果還去調用緩存的話,那么結果會不如意。

解決辦法:

將cacheName的值轉為動態的:

         1.根據文件名+修改時間

         2.文件的MD5值作為cacheName

         3.文件流轉換為新的文本字符串(獲取文件內容)

         ........       

 

cacheName細節:

即使cacheName寫成一個固定的值,當cshtml發生改變的時候Parse()方法執行后的結果,也會是發生改變的內容。

 

 

 


 

自己封裝一個Razor.Parse()方法

 1     /// <summary>
 2         /// 自己封裝一個Razor.Parse()方法
 3         /// </summary>
 4         /// <param name="context">上下文對象</param>
 5         /// <param name="cshtmlPath">.cshtml文件的相對路徑</param>
 6         /// <param name="obj">要傳入的對象參數</param>
 7         /// <returns>返回一個解析過的Razor模板字符串</returns>
 8         private string RazorParse(HttpContext context, string cshtmlPath,params object[] obj)
 9         {
10             //獲得.cshtml文件的絕對路徑
11             string path = context.Server.MapPath(cshtmlPath);
12             //通過路徑將文件讀成文本
13             string txt = File.ReadAllText(path);
14 
15             //為模板準備一個緩沖,根據文件的修改時間動態組合
16             string cacheName = path + File.GetLastWriteTime(path);
17 
18             //根據需求是否要傳入對象參數,在調用Razor.Parse方法返回解析好的Razor模板
19             return obj.Length > 0 ? RazorEngine.Razor.Parse(txt, obj[0], cacheName) : RazorEngine.Razor.Parse(txt, cacheName);
20         
21         }
View Code

 


 

 

HtmlEncodeString()方法

在往模板傳入字符串的格式,如果為html格式,該方法會將其轉義,在模板顯示字符串本身,而不會被模板解析為html標簽

代碼:

  public static HtmlEncodedString Test1()

        {

            return new HtmlEncodedString("<input type='text' />");

        }

 


 

 

RawString()方法

可以將類似于html的字符串,傳入前臺模板,可以被解析標簽相應的含義

代碼:

      public static RawString Test2()

        {

            return new RawString("<input type='text' />");

        }

 


 

 

Razor模板調用外部方法(在.cshtml模板頁上調用在后臺用C#寫好的一個方法)

1.在.cshtml頂部引入方法的命名空間

@using 命名空間名稱

2.調用

@類名.方法() ,不需要";"號。  如:@Handler1.Test1()

 

 

業務實例

通過外部方法生成一個Checked標簽

 1     public static RawString CreateChecked_input(string id,bool isChecked)
 2 
 3         {
 4 
 5             StringBuilder sb = new StringBuilder();
 6 
 7             sb.Append("<input type='checkbox' id=" + id).Append("  checked="+ (isChecked==true?"checked":"")).Append(" />");
 8 
 9  
10             return new RawString(sb.ToString());   
11 
12  
13 
14         }

 

調用

 1 @using Demo.Razor
 2 <!DOCTYPE html>
 3 <html xmlns="http://www.w3.org/1999/xhtml">
 4 <head>
 5 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
 6     <title></title>
 7 </head>
 8 <body>
 9        
10      @Handler1.CreateChecked_input("t1", true)
11 
12 </body>
13 </html>

 

總結:因為在后臺很多數據時動態讀取數據庫的信息而組成的,將繁瑣的拼接封裝在后臺,前臺頁面清晰,而封裝的方法還可以重復利用到其他業務中

 


 


文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()