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