RazorEngine在非MVC下的使用,以及使用自定義模板

来源:http://www.cnblogs.com/xlyeah/archive/2016/02/19/5201889.html
-Advertisement-
Play Games

---恢復內容開始--- 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

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • atitit.ntfs ext 文件系統新特性對比 1. 現代文件系統應該有的特性2 1.1. 恢復Log2 1.2. 壓縮2 1.3. Meta ext2 1.4. Fulltextཟsearch 全文2 1.5. Copy 校驗2 1.6. 稀疏文件,這是UNIX類和NTFS等文件系統的一個特性
  • 今天老師說了一個例子,提生面向對象思想,和大家分享下 雙擊可對其評價和評分 相對以前 我們有可能會這樣寫 //定義一個Tool類進行傳值 Tool.name = lv.SelectedItems[0].SubItems[1].Text;//姓名 Tool.pingjia = lv.SelectedI
  • 在程式中建立如下方法。 #region 刷新數據源 /// ///刷新數據源 /// /// dgv that is needed to refresh public void RefreshDataSourceOndgv(DataGridView dgv) ...
  • 在代碼生成工具的各種功能規劃中,我們一向以客戶的需求作為驅動,因此也會根據需要增加一些特殊的功能或者處理。在實際的開發中,雖然我們一般以具體的表進行具體業務開發,但是有些客戶提出有時候視圖開發也是很常見的,為了提高代碼生成和界面生成的效率,基於視圖開發的過程也應該支持。還有主從表的界面生成操作,在很...
  • 最近在做個包含了大量重覆樣式的控制項的網站. 如果用MVC的話,我可以針對每個需要單獨塊編輯的Model寫一個局部視圖. 然後根據不同邏輯需求拼起來.用現成MVC框架非常容易做到. 但環境是3.5的最高只能用MVC2,沒有razor語法,加上沒裝開發環境. 於是想乾脆自己寫一個模板生成HTML的框架,
  • 這個是2011年寫的一個技術貼,現在看可能有點過時了,有興趣的朋友也可以看一下。 一. 描述 在開發winform程式時不會考慮頁面刷新問題,只要控制好線程別導致假死就ok了,但是在開發web頁面程式時,刷新有的時候真是頭痛的很。頁面回調可以解決這個問題,下麵簡單就實用來講對callback做下介紹
  • 前言: NPOI 技術在別人看來可能有點老生長談了,但是對於我現在處於的這個創業型公司,還是挺前沿的,不知道是前輩們不知道這個技術,還是懶得去對現有的軟體進行修改,因為在現有的軟體中,幾乎所有的數據導入導出都是依賴於: Excel.Application(設置excel組件,系統許可權,然後還得考慮版
  • 1、sealed 修飾符 概念: C#提出了一個密封類(sealed class)的概念,幫助開發人員來解決這一問題。 密封類在聲明中使用sealed 修飾符,這樣就可以防止該類被其它類繼承。如果試圖將一個密封類作為其它類的基類,C#將提示出錯。理所當然,密封類不能同時又是抽象類,因為抽象總是希望被
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...