Razor模板引擎 (RazorEngine)

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

這樣以來咱們能夠在非ASP.NET MVC項目中使用Razor引擎,甚至在控制檯,WinForm項目中均可以使用。數據庫

 

 

文件的建立緩存

文件是一個後綴名爲cshtml的文件,若是在非MVC項目中建立Razor文件,能夠新建一個html,把後綴名該爲cshtml。服務器

 


 

RazorEngine使用初體驗ide

1、前臺:ui

2、後臺代碼spa

解釋:.net

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

後臺代碼首先得到cshtml文件將其讀成文本文件,在經過Razor.Parse將文本解析爲,含義爲Razor的模板,將其展出。訪問的話應訪問代碼頁面,cshtml只是一個展現模板,等待代碼動態繪製內容使用cshtml模板展現.orm

 


 

 

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>

 

總結:由於在後臺不少數據時動態讀取數據庫的信息而組成的,將繁瑣的拼接封裝在後臺,前臺頁面清晰,而封裝的方法還能夠重複利用到其餘業務中

相關文章
相關標籤/搜索