---恢復內容開始--- RazorEngine模板引擎大大的幫助了我們簡化字元串的拼接與方法的調用,開源之後,現在在簡單的web程式,winform程式,甚至控制台程式都可以利用它來完成。 但如何在使用中調用方法和使用自定義模板呢?來看這樣一個例子 1 string str="hello @Mod
---恢復內容開始---
RazorEngine模板引擎大大的幫助了我們簡化字元串的拼接與方法的調用,開源之後,現在在簡單的web程式,winform程式,甚至控制台程式都可以利用它來完成。
但如何在使用中調用方法和使用自定義模板呢?來看這樣一個例子
1 string str="hello @Model.Name"; 2 string parse=Razor.Prase(str,new {Name="Tom"}); 3 Console.WriteLine(parse);
這裡就輸出了hello Tom的內容
以下為了方便,我們不試用控制台,把str擴展到cshtml文件來做模板。
我們首先來寫一個RazorHelper的類,裡面的Parse方法用來封裝
1 namespace RazorEngineTest 2 { 3 public class RazorHelper 4 { 5 public static string Parse<T>(HttpContext context,string virtualPath,T Model) 6 { 7 string path = context.Server.MapPath(virtualPath); 8 string rawhtml = File.ReadAllText(path); 9 //設置cacheName緩存。 10 string cacheName = path + File.GetLastWriteTime(path); 11 string parseHtml = Razor.Parse<T>(rawhtml, Model, cacheName); 12 return parseHtml; 13 } 14 } 15 }
這樣,在使用我們只需在cshtml也這麼寫就行,通過Model.方法即可
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title></title> <meta charset="utf-8" /> </head> <body> @Model.Name </body> </html>
那麼現在我想在cshtml里調用razor中的方法,就類似
@Raw("<h1>Raw</h1>")
即可調用Razor中的Raw方法,返回一個h1標題的test
那麼為了簡化起見,我們又如何使用自定義的方法呢?
我總結兩種方法:
1.直接使用我們之前創造的RazorHelper。在這個類後我們接著寫,
比如,這兩個方法。
1 /// <summary> 2 /// 用於輸出原始html 3 /// </summary> 4 /// <param name="value">參數</param> 5 /// <returns></returns> 6 public static IEncodedString RawHtml(string value) 7 { 8 return new RawString(value); 9 } 10 /// <summary> 11 /// 用於輸出轉義後字元 12 /// </summary> 13 /// <param name="value">參數</param> 14 /// <returns></returns> 15 public static HtmlEncodedString Text(string value) 16 { 17 return new HtmlEncodedString(value); 18 }
這樣我們在cshtml頁就可以通過以下方式調用,第一個RawHtml是類似之前自帶的Raw()方法輸出,輸出原始字元,Text方法則輸出轉義後字元。
@using RazorEngineTest @RazorHelper.RawHtml("<h1>RazorHelper.RawHtml</h1>") @RazorHelper.Text("List<T>")
那麼通過這種方式一我們就可以實現自定義的方法。
---------------------------------------分割線----------------------------------
當然除此之外,我更加推薦方法二,這種方法更為方便,且調用時更為簡潔。也就是使用Razor自定義模板
由於在Razor中,存在一個TemplateBase<T>這個TemplateBase就是我們的基類模板,可見它實現了Itemplate介面,
而且經過反編譯,看出它Write,WriteLiteral方法是用來進行字元串拼接的。沒錯Razor內部卻是進行的是字元串拼接,只不過比我們的拼接要厲害的多。
大概是這種方式
1 public string Execute(object Model) 2 { 3 stringBuilder sb = new stringBuilder(string.Empty); 4 sb.append("<html><head></head><body>"); 5 sb.append(Model.Name); 6 sb.append("</body></html>"); 7 return sb.toString(); 8 }
不過我們現在要自己創建模板和方法。當然我們不可能自己再重新造輪子,所以我們使用造好的BaseTemplate
讓我們的MyTemplate<T>繼承自TemplateBase<T>
那麼在MyTemplate<T>裡面,就可以寫我們自己的方法了
為了更好理解我們還是用上述例子。
1 public class MyTemplate<T>:TemplateBase<T> 2 { 3 //用於輸出原始html 4 public IEncodedString OutputRawString(string value) 5 { 6 return new RawString(value); 7 } 8 //輸出轉義後內容 9 public HtmlEncodedString OutputHtmlString(string value) 10 { 11 return new HtmlEncodedString(value); 12 } 13 }
不過我們在使用前需要註冊模板,也在razorHelper里定義,方便調用
1 public static void SetTemplate(Type templateType) 2 { 3 Razor.SetTemplateService(new TemplateService(new TemplateServiceConfiguration() 4 { 5 BaseTemplateType = typeof(MyTemplate<>) 6 })); 7 8 }
使用時,在之前註冊一下就好
1 RazorHelper.SetTemplate(typeof(MyTemplate<>)); 2 string parse = RazorHelper.Parse(context, "~/Razor1.cshtml", new { Name = "Jerry" });
我們在cshtml也就可以這麼寫了
@OutputRawString("<h1>MyTemplate</h1>")即可
這就是自定義模板和自定義方法怎麼使用。
可是問題如下,如果我們有很多方法,都放在自定義模板下,則會變得非常臃腫,
比如@OutputRawString @Add @AddHtml @ChangeString @ChangeHtml.....等等越來越多,那麼我們用一種方式把它分類如何。
我們可以自定義一個類,比如MyRazorHtmlHelper,裡面有幾個方法
1 public class MyRazorHtmlHelper 2 { 3 //輸出原始html 4 public IEncodedString RawString(string value) 5 { 6 return new RawString(value); 7 } 8 //輸出一個checkbox 9 public IEncodedString CheckBox(string id,string value,bool IsChecked) 10 { 11 StringBuilder sb = new StringBuilder(string.Empty); 12 sb.Append("<input type='checkbox' id=").Append(id).Append("' value='").Append("' "); 13 if (IsChecked) 14 { 15 sb.Append("checked"); 16 } 17 sb.Append("/>"); 18 return new RawString(sb.ToString()); 19 } 20 }
之後如何在我們的MyTemplate使用呢?
我們可以實例化一個MyRazorHtmlHelper對象,然後返回它就行
1 private MyRazorHtmlHelper htmlhelper; 2 public MyRazorHtmlHelper Html //寫調用的名稱 3 { 4 get 5 { 6 if (htmlhelper==null) 7 { 8 htmlhelper = new MyRazorHtmlHelper(); 9 } 10 return htmlhelper; 11 } 12 }
這樣我們就可以通過 @Html.方法名來進行調用了
比如
@Html.CheckBox("cb","Gender",true)這是checkbox
這樣就可以讓我們對不同方法進行分類,類似nameSpace一樣,使用非常方便。
這就是開源的RazorEngine的強大,以及自定義模板的用法
放上源碼
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 5 <title></title> 6 <meta charset="utf-8" /> 7 </head> 8 <body> 9 @Model.Name 10 @Raw("<h1>Raw</h1>") 11 12 @using RazorEngineTest 13 @RazorHelper.RawHtml("<h1>RazorHelper.RawHtml</h1>") 14 @RazorHelper.Text("List<T>") 15 16 @OutputRawString("<h1>MyTemplate</h1>") 17 18 @Html.CheckBox("cb","Gender",true)這是checkbox 19 </body> 20 </html>Razor1.cshtml
1 public void ProcessRequest(HttpContext context) 2 { 3 context.Response.ContentType = "text/html"; 4 5 RazorHelper.SetTemplate(typeof(MyTemplate<>)); 6 string parse = RazorHelper.Parse(context, "~/Razor1.cshtml", new { Name = "Jerry" }); 7 8 context.Response.Write(parse); 9 10 }Razor1.ashx.cs
1 using RazorEngine; 2 using RazorEngine.Configuration; 3 using RazorEngine.Templating; 4 using RazorEngine.Text; 5 using System; 6 using System.Collections.Generic; 7 using System.IO; 8 using System.Linq; 9 using System.Text; 10 using System.Web; 11 12 namespace RazorEngineTest 13 { 14 public class MyRazorHtmlHelper 15 { 16 //輸出原始html 17 public IEncodedString RawString(string value) 18 { 19 return new RawString(value); 20 } 21 //輸出一個checkbox 22 public IEncodedString CheckBox(string id,string value,bool IsChecked) 23 { 24 StringBuilder sb = new StringBuilder(string.Empty); 25 sb.Append("<input type='checkbox' id=").Append(id).Append("' value='").Append("' "); 26 if (IsChecked) 27 { 28 sb.Append("checked"); 29 } 30 sb.Append("/>"); 31 return new RawString(sb.ToString()); 32 } 33 } 34 public class MyTemplate<T>:TemplateBase<T> 35 { 36 private MyRazorHtmlHelper htmlhelper; 37 public MyRazorHtmlHelper Html 38 { 39 get 40 { 41 if (htmlhelper==null) 42 { 43 htmlhelper = new MyRazorHtmlHelper(); 44 } 45 return htmlhelper; 46 } 47 } 48 //用於輸出原始html 49 public IEncodedString OutputRawString(string value) 50 { 51 return new RawString(value); 52 } 53 //輸出轉義後內容 54 public HtmlEncodedString OutputHtmlString(string value) 55 { 56 return new HtmlEncodedString(value); 57 } 58 } 59 public class RazorHelper 60 { 61 public static void SetTemplate(Type templateType) 62 { 63 Razor.SetTemplateService(new TemplateService(new TemplateServiceConfiguration() 64 { 65 BaseTemplateType = templateType 66 })); 67 68 } 69 public static string Parse<T>(HttpContext context,string virtualPath,T Model) 70 { 71 string path = context.Server.MapPath(virtualPath); 72 string rawhtml = File.ReadAllText(path); 73 //設置cacheName緩存。 74 string cacheName = path + File.GetLastWriteTime(path); 75 string parseHtml = Razor.Parse<T>(rawhtml, Model, cacheName); 76 return parseHtml; 77 } 78 /// <summary> 79 /// 用於輸出原始html 80 /// </summary> 81 /// <param name="value">參數</param> 82 /// <returns></returns> 83 public static IEncodedString RawHtml(string value) 84 { 85 return new RawString(value); 86 } 87 /// <summary> 88 /// 用於輸出轉義後字元 89 /// </summary> 90 /// <param name="value">參數</param> 91 /// <returns></returns> 92 public static HtmlEncodedString Text(string value) 93 { 94 return new HtmlEncodedString(value); 95 } 96 97 } 98 }RazorHelper.cs