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

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的强大,以及自定义模板的用法

放上源码

 <!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
@Raw("<h1>Raw</h1>") @using RazorEngineTest
@RazorHelper.RawHtml("<h1>RazorHelper.RawHtml</h1>")
@RazorHelper.Text("List<T>") @OutputRawString("<h1>MyTemplate</h1>") @Html.CheckBox("cb","Gender",true)这是checkbox
</body>
</html>

Razor1.cshtml

   public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/html"; RazorHelper.SetTemplate(typeof(MyTemplate<>));
string parse = RazorHelper.Parse(context, "~/Razor1.cshtml", new { Name = "Jerry" }); context.Response.Write(parse); }

Razor1.ashx.cs

 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

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

  1. 在ASP.NET非MVC环境中(WebForm中)构造MVC的URL参数

    目前项目中有个需求,需要在WebForm中去构造MVC的URL信息,这里写了一个帮助类可以在ASP.NET非MVC环境中(WebForm中)构造MVC的URL信息,主要就是借助当前Http上下文去构造 ...

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

    一.基于线程池的请求处理ASP.NET通过线程池的机制处理并发的HTTP请求.一个Web应用内部维护着一个线程池,当探测到抵达的针对本应用的请求时,会从池中获取一个空闲的线程来处理该请求.当处理完毕, ...

  3. C# 验证码生成(MVC和非MVC两种方式)

    /// <summary> /// 生成验证码 /// </summary> /// <param name="length">指定验证码的长度 ...

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

    在网站运行中,错误是不可避免的,错误页的产生也是不可缺少的. 这几天看了博友的很多文章,自己想总结下我从中学到的和实际中配置的. 首先,需要知道产生错误页的来源,一种是我们的.NET平台抛出的,一种是 ...

  5. MVC下 把数据库中的byte[]值保存成图片,并显示在view页面

    MVC下 把数据库中的byte[]值转成图片,并显示在view页面 controller中的action方法 //显示图片[AllowAnonymous]public ActionResult Sho ...

  6. 在ASP.NET非MVC环境中(WebForm中)构造MVC的URL参数,以及如何根据URL解析出匹配到MVC路由的Controller和Action

    目前项目中有个需求,需要在WebForm中去构造MVC的URL信息,这里写了一个帮助类可以在ASP.NET非MVC环境中(WebForm中)构造MVC的URL信息,主要就是借助当前Http上下文去构造 ...

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

    以前发短信使用过短信猫,现在,更多地是使用第三方API.大致过程是: → 用户在页面输入手机号码→ 用户点击"获取验证码"按钮,把手机号码发送给服务端,服务端产生几位数的随机码,并 ...

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

    http://www.cnblogs.com/artech/archive/2012/06/20/async-action-in-mvc.html Visual Studio提供的Controller ...

  9. MVC下压缩输入的HTML内容

    在MVC下如何压缩输出的HTML代码,替换HTML代码中的空白,换行符等字符? 1.首先要了解MVC是如何输出HTML代码到客户端的,先了解下Controller这个类,里面有很多方法,我们需要的主要 ...

随机推荐

  1. 求助:IIS中部署WCF,生成的WSDL中怎么把“计算机名”改成IP==找到一个解决办法

    环境:win2003 IIS6 VS2008 求助: 如图: 有朋友遇到过这个问题吗?还是说这个不是问题? 先 谢谢了! 补充配置文件: 代码 目前解决办法: 修改IIS的配置: 如图: 解决后的ws ...

  2. C# 操作 Word 修改word的高级属性中的自定义属性

    为 Microsoft Word 创建自动化客户端 启动 Visual Studio .NET. 在文件菜单上,单击新建,然后单击项目.从 Visual C# 项目类型中选择 Windows 应用程序 ...

  3. SR4K的API使用(libMesaSR.dll)

    看看libMesaSR.dll的导出函数: 遇到的问题: error C4430: 缺少类型说明符 - 假定为 int.注意: C++ 不支持默认 int 解决: HWND等未定义 解决: #incl ...

  4. C++之内部类(嵌套类)与外部类及友元

    本人能力.精力有限,所言所感都基于自身的实践和有限的阅读.查阅,如有错误,欢迎拍砖,敬请赐教——博客园:钱智慧. 先上代码: class Outer { public: Outer(){m_outer ...

  5. Html笔记(三)列表

    列表标签: <dl> <dt>:上层标签 <dd>:下层标签 例: <dl> <dt>上层项目</dt> <dd>下 ...

  6. NOIP2001 数的划分

    题二 数的划分(20分) 问题描述 将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序). 例如:n=7,k=3,下面三种分法被认为是相同的. 1,1,5; 1,5,1; 5,1,1; 问 ...

  7. WordPress更新服务加快收录

    WordPress更新服务的设置在后台"设置"-"撰写".更新服务下的文本框中默认为http://rpc.pingomatic.com/.该地址网站Ping-o ...

  8. hdoj 1898 Sempr == The Best Problem Solver?

    Sempr == The Best Problem Solver? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/3276 ...

  9. ios真机调试详细步骤

    •真机调试的主要步骤 1.登录开发者主页 2.生成cer证书:cer是一个跟电脑相关联的证书文件,让电脑具备真机调试的功能 3.添加App ID:调试哪些app? 4.注册真机设备:哪台设备需要做真机 ...

  10. php排序之快速排序

    关于快速排序的介绍 请看百度百科讲解的很详细 http://baike.baidu.com/link?url=1VOpp4qjdwKma81MFPozjvyPy2rYJos6ZmfP5Ady3xjEP ...