RazorEngine在非MVC下的使用,以及使用自定义模板
2016-02-19 18:13
239 查看
---恢复内容开始---
RazorEngine模板引擎大大的帮助了我们简化字符串的拼接与方法的调用,开源之后,现在在简单的web程序,winform程序,甚至控制台程序都可以利用它来完成。
但如何在使用中调用方法和使用自定义模板呢?来看这样一个例子
这里就输出了hello Tom的内容
以下为了方便,我们不试用控制台,把str扩展到cshtml文件来做模板。
我们首先来写一个RazorHelper的类,里面的Parse方法用来封装
这样,在使用我们只需在cshtml也这么写就行,通过Model.方法即可
那么现在我想在cshtml里调用razor中的方法,就类似
即可调用Razor中的Raw方法,返回一个h1标题的test
那么为了简化起见,我们又如何使用自定义的方法呢?
我总结两种方法:
1.直接使用我们之前创造的RazorHelper。在这个类后我们接着写,
比如,这两个方法。
这样我们在cshtml页就可以通过以下方式调用,第一个RawHtml是类似之前自带的Raw()方法输出,输出原始字符,Text方法则输出转义后字符。
那么通过这种方式一我们就可以实现自定义的方法。
---------------------------------------分割线----------------------------------
当然除此之外,我更加推荐方法二,这种方法更为方便,且调用时更为简洁。也就是使用Razor自定义模板
由于在Razor中,存在一个TemplateBase<T>这个TemplateBase就是我们的基类模板,可见它实现了Itemplate接口,
而且经过反编译,看出它Write,WriteLiteral方法是用来进行字符串拼接的。没错Razor内部却是进行的是字符串拼接,只不过比我们的拼接要厉害的多。
大概是这种方式
不过我们现在要自己创建模板和方法。当然我们不可能自己再重新造轮子,所以我们使用造好的BaseTemplate
让我们的MyTemplate<T>继承自TemplateBase<T>
那么在MyTemplate<T>里面,就可以写我们自己的方法了
为了更好理解我们还是用上述例子。
不过我们在使用前需要注册模板,也在razorHelper里定义,方便调用
使用时,在之前注册一下就好
我们在cshtml也就可以这么写了
@OutputRawString("<h1>MyTemplate</h1>")即可
这就是自定义模板和自定义方法怎么使用。
可是问题如下,如果我们有很多方法,都放在自定义模板下,则会变得非常臃肿,
比如@OutputRawString @Add @AddHtml @ChangeString @ChangeHtml.....等等越来越多,那么我们用一种方式把它分类如何。
我们可以自定义一个类,比如MyRazorHtmlHelper,里面有几个方法
之后如何在我们的MyTemplate使用呢?
我们可以实例化一个MyRazorHtmlHelper对象,然后返回它就行
这样我们就可以通过 @Html.方法名来进行调用了
比如
这样就可以让我们对不同方法进行分类,类似nameSpace一样,使用非常方便。
这就是开源的RazorEngine的强大,以及自定义模板的用法
放上源码
RazorHelper.cs
RazorEngine模板引擎大大的帮助了我们简化字符串的拼接与方法的调用,开源之后,现在在简单的web程序,winform程序,甚至控制台程序都可以利用它来完成。
但如何在使用中调用方法和使用自定义模板呢?来看这样一个例子
string str="hello @Model.Name"; string parse=Razor.Prase(str,new {Name="Tom"}); Console.WriteLine(parse);
这里就输出了hello Tom的内容
以下为了方便,我们不试用控制台,把str扩展到cshtml文件来做模板。
我们首先来写一个RazorHelper的类,里面的Parse方法用来封装
namespace RazorEngineTest { public class RazorHelper { public static string Parse<T>(HttpContext context,string virtualPath,T Model) { string path = context.Server.MapPath(virtualPath); string rawhtml = File.ReadAllText(path); //设置cacheName缓存。 string cacheName = path + File.GetLastWriteTime(path); string parseHtml = Razor.Parse<T>(rawhtml, Model, cacheName); return parseHtml; } } }
这样,在使用我们只需在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。在这个类后我们接着写,
比如,这两个方法。
/// <summary> /// 用于输出原始html /// </summary> /// <param name="value">参数</param> /// <returns></returns> public static IEncodedString RawHtml(string value) { return new RawString(value); } /// <summary> /// 用于输出转义后字符 /// </summary> /// <param name="value">参数</param> /// <returns></returns> public static HtmlEncodedString Text(string value) { return new HtmlEncodedString(value); }
这样我们在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内部却是进行的是字符串拼接,只不过比我们的拼接要厉害的多。
大概是这种方式
public string Execute(object Model) { stringBuilder sb = new stringBuilder(string.Empty); sb.append("<html><head></head><body>"); sb.append(Model.Name); sb.append("</body></html>"); return sb.toString(); }
不过我们现在要自己创建模板和方法。当然我们不可能自己再重新造轮子,所以我们使用造好的BaseTemplate
让我们的MyTemplate<T>继承自TemplateBase<T>
那么在MyTemplate<T>里面,就可以写我们自己的方法了
为了更好理解我们还是用上述例子。
public class MyTemplate<T>:TemplateBase<T> { //用于输出原始html public IEncodedString OutputRawString(string value) { return new RawString(value); } //输出转义后内容 public HtmlEncodedString OutputHtmlString(string value) { return new HtmlEncodedString(value); } }
不过我们在使用前需要注册模板,也在razorHelper里定义,方便调用
public static void SetTemplate(Type templateType) { Razor.SetTemplateService(new TemplateService(new TemplateServiceConfiguration() { BaseTemplateType = typeof(MyTemplate<>) })); }
使用时,在之前注册一下就好
RazorHelper.SetTemplate(typeof(MyTemplate<>)); string parse = RazorHelper.Parse(context, "~/Razor1.cshtml", new { Name = "Jerry" });
我们在cshtml也就可以这么写了
@OutputRawString("<h1>MyTemplate</h1>")即可
这就是自定义模板和自定义方法怎么使用。
可是问题如下,如果我们有很多方法,都放在自定义模板下,则会变得非常臃肿,
比如@OutputRawString @Add @AddHtml @ChangeString @ChangeHtml.....等等越来越多,那么我们用一种方式把它分类如何。
我们可以自定义一个类,比如MyRazorHtmlHelper,里面有几个方法
public class MyRazorHtmlHelper { //输出原始html public IEncodedString RawString(string value) { return new RawString(value); } //输出一个checkbox public IEncodedString CheckBox(string id,string value,bool IsChecked) { StringBuilder sb = new StringBuilder(string.Empty); sb.Append("<input type='checkbox' id=").Append(id).Append("' value='").Append("' "); if (IsChecked) { sb.Append("checked"); } sb.Append("/>"); return new RawString(sb.ToString()); } }
之后如何在我们的MyTemplate使用呢?
我们可以实例化一个MyRazorHtmlHelper对象,然后返回它就行
private MyRazorHtmlHelper htmlhelper; public MyRazorHtmlHelper Html //写调用的名称 { get { if (htmlhelper==null) { htmlhelper = new MyRazorHtmlHelper(); } return htmlhelper; } }
这样我们就可以通过 @Html.方法名来进行调用了
比如
@Html.CheckBox("cb","Gender",true)这是checkbox
这样就可以让我们对不同方法进行分类,类似nameSpace一样,使用非常方便。
这就是开源的RazorEngine的强大,以及自定义模板的用法
放上源码
using RazorEngine; using RazorEngine.Configuration; using RazorEngine.Templating; using RazorEngine.Text; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Web; namespace RazorEngineTest { public class MyRazorHtmlHelper { //输出原始html public IEncodedString RawString(string value) { return new RawString(value); } //输出一个checkbox public IEncodedString CheckBox(string id,string value,bool IsChecked) { StringBuilder sb = new StringBuilder(string.Empty); sb.Append("<input type='checkbox' id=").Append(id).Append("' value='").Append("' "); if (IsChecked) { sb.Append("checked"); } sb.Append("/>"); return new RawString(sb.ToString()); } } public class MyTemplate<T>:TemplateBase<T> { private MyRazorHtmlHelper htmlhelper; public MyRazorHtmlHelper Html { get { if (htmlhelper==null) { htmlhelper = new MyRazorHtmlHelper(); } return htmlhelper; } } //用于输出原始html public IEncodedString OutputRawString(string value) { return new RawString(value); } //输出转义后内容 public HtmlEncodedString OutputHtmlString(string value) { return new HtmlEncodedString(value); } } public class RazorHelper { public static void SetTemplate(Type templateType) { Razor.SetTemplateService(new TemplateService(new TemplateServiceConfiguration() { BaseTemplateType = templateType })); } public static string Parse<T>(HttpContext context,string virtualPath,T Model) { string path = context.Server.MapPath(virtualPath); string rawhtml = File.ReadAllText(path); //设置cacheName缓存。 string cacheName = path + File.GetLastWriteTime(path); string parseHtml = Razor.Parse<T>(rawhtml, Model, cacheName); return parseHtml; } /// <summary> /// 用于输出原始html /// </summary> /// <param name="value">参数</param> /// <returns></returns> public static IEncodedString RawHtml(string value) { return new RawString(value); } /// <summary> /// 用于输出转义后字符 /// </summary> /// <param name="value">参数</param> /// <returns></returns> public static HtmlEncodedString Text(string value) { return new HtmlEncodedString(value); } } }
RazorHelper.cs
相关文章推荐
- iOS启动图片适配问题
- mac的svn之cornerstone简易教程
- quick-mark: How Latency is Measured
- Android原生定位
- jquery对象和DOM对象的相互转换
- 项目管理工具~SVN
- c语言:把只含因子2、3和5的数称为丑数,求按从小到大的顺序的第1500个丑数(两种方法比较)
- win7 linux 搭建redis单机环境 详细
- 00 EPLAN安装问题
- 网络工具
- iOS 9之后两个应用的相互调用
- 改bug总结—2015年12月于nice实习
- ci 使用体会
- 用booktabs宏包改善你的表格
- Mos_Tec Tutorial : 001 - iOS视频录制
- SVM
- 【他山之玉】习而学的工程教育
- 微信api, 创建菜单
- 微信api 关注事件
- Debian系统下实现通过wpa_config连接WPA-PSK加密的Wifi连接