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