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

---恢复内容开始---

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

时间: 2024-10-05 03:46:06

RazorEngine在非MVC下的使用,以及使用自定义模板的相关文章

ASP.NET MVC下的异步Action的定义和执行原理

Visual Studio提供的Controller创建向导默认为我们创建一个继承自抽象类Controller的Controller类型,这样的Controller只能定义同步Action方法.如果我们需要定义异步Action方法,必须继承抽象类AsyncController.这篇问你讲述两种不同的异步Action的定义方法和底层执行原理.[本文已经同步到<How ASP.NET MVC Works?>中] 目录 一.基于线程池的请求处理 二.两种异步Action方法的定义     XxxAs

在非MVC中使用Razor模板引擎

模板引擎介绍 Razor.Nvelocity.Vtemplate,因为Razor在VS中有自动提示,使用方便有效率. 在非MVC中使用Razor模板引擎 借助于开源的RazorEngine,我们可以在非asp.net mvc项目中使用Razor引擎,甚至在控制台.WinForm项目中都可以使用Razor(自己开发代码生成器) 如何使用Razor 环境搭建: 1,添加引用RazorEngine.dll 2,创建cshtml 新建一个html,改名为cshtml.注意:通过 添加--html页再改成

在ASP.NET MVC下通过短信验证码注册

以前发短信使用过短信猫,现在,更多地是使用第三方API.大致过程是: → 用户在页面输入手机号码→ 用户点击"获取验证码"按钮,把手机号码发送给服务端,服务端产生几位数的随机码,并保存在某个地方(Session, Applicaiton, 数据库, 等等),调用第三方的API→ 第三方发送几位数的随机码至用户手机→ 用户在页面输入接收到的随机码→ 把随机码等发送给服务端,与服务端保存的随机码比较,如果一致,就通过,让注册 就按如下界面来说吧: 我们需要考虑的方面包括: ● 手机号码:判

ASP.NET MVC下的异步Action的定义和执行原理[转]

http://www.cnblogs.com/artech/archive/2012/06/20/async-action-in-mvc.html Visual Studio提供的Controller创建向导默认为我们创建一个继承自抽象类Controller的Controller类型,这样的Controller只能定义同步Action方法.如果我们需要定义异步Action方法,必须继承抽象类AsyncController.这篇问你讲述两种不同的异步Action的定义方法和底层执行原理.[本文已经

ASP.NET MVC下自定义错误页和展示错误页的几种方式

在网站运行中,错误是不可避免的,错误页的产生也是不可缺少的. 这几天看了博友的很多文章,自己想总结下我从中学到的和实际中配置的. 首先,需要知道产生错误页的来源,一种是我们的.NET平台抛出的,一种是网站所依赖的宿主抛出的,一般来讲我们所依赖的宿主就是IIS了. IIS中的错误页入口: 其中的错误码想必并不陌生 这里是在服务器上找不到所需资源时抛出的错误页,在这里可以设置需要展示的错误页面,只需将预定的错误页面加入服务器中,然后在指定状态码下配置路径即可. 这是请求在IIS中时,还未完全进入到a

MVC下微信企业号网页应用开发调用JSSDK接口不成功问题

在MVC下进行企业微信里的网页应用开发,前台页面中为了调用图像接口,使用了JSSDK.按照官方文档进行了正确配置. 现象:WEB开发工具调试一切正常,但从手机企业微信应用进入页面后接口调用无效(这个页面是从一级页面链接过来的),开了调试模式后,显示config:ok.说明配置无误.经过反复检查,终于发现问题所在. 原因:在一级页面(http://xx.xxx.xxx/main/index)中的链接是使用htmlhelper来写的,即@Html.ActionLink("测试接口",&qu

ASP.NET MVC下的四种验证编程方式[续篇]

在<ASP.NET MVC下的四种验证编程方式>一文中我们介绍了ASP.NET MVC支持的四种服务端验证的编程方式("手工验证"."标注ValidationAttribute特性"."让数据类型实现IValidatableObject或者IDataErrorInfo"),那么在ASP.NET MVC框架内部是如何提供针对这四种不同编程方式的支持的呢?接下来我们就来聊聊这背后的故事. 一.ModelValidator与ModelVal

__block在ARC和非ARC下有什么不同

一般在block中修改变量都需要事先加block进行修饰.在非arc中,block修饰的变量的引用计算是不变的.在arc中,会引用到,并且计算+1:非arc下可使用(arc直接使用__weak即可) //非ARC __block typeof(self) weakSelf = self; self.myBlock = ^(int paramInt){ //使用weakSelf访问self成员 [weakSelf anotherFunc]; }; 这样可以解决循环引用问题. starain Dou

如何在非空目录下 git clone 项目

在非空目录下 git clone 项目时会提示错误信息: fatal: destination path '.' already exists and is not an empty directory. 解决办法: 1. 进入非空目录,假设是 /dir/jk1 2. git clone --no-checkout https://git.oschina.net/jankerli/test.git tmp 3. mv tmp/.git . 4. rmdir tmp 5. git reset --