Razor是ASP.NET MVC 3中新加入的技术,以作为ASPX引擎的一个新的替代项。简洁的语法与.NET Framework 结合,广泛应用于ASP.NET MVC 项目。Razor Pad是一个编辑Razor脚本的工具,脱离于ASP.NET 和Visual Studio。

微软已经有一套模板引擎T4,在设计ASP.NET MVC 3时又设计一套模板引擎Razor,对开发者而言是多一种选择,但同时也增加学习成本,至今我都没有时间和精力将Code Smith的模板转化为T4的模板。

Razor  从模板到.NET 代码

以cshtml为后缀名的为Razor模板,可以混合脚本语言和Html代码,以呈现为ASP.NET Page页面。

来看下面的Razor脚本片段,它以div的格式输出Posts对象的标题:

<div>
@foreach(var post in Posts) {
<div>@post.Title</div>
}
</div>

Razor引擎分析上面的脚本,产生如下所示的Xml文本片段

<Document>
  <Markup><div>\r\n\t</Markup>
     <Statement>
      <Transition>@</Transition>
       <Code>foreach(var post in posts) { </Code>
        <Markup>
        <Markup><div></Markup>
       <Expression>
         <Transition>@</Transition>
         <ImplicitExpression>post.Title</ImplicitExpression>
        </Expression>
        <Markup></div></Markup>
        </Markup>
       <Code> } </Code>
      <Markup></div></Markup>
    </Statement>
  <Markup>\r\n</div></Markup>
</Document>

以空格或是@作为区域(block)的分割符,将Razor解析成一个表达式树。@在Razor模板中的用法相当灵活,可以用于表达式的求值,或是定义代码块。

然后产生.NET代码,上面的脚本,会产生如下的.NET代码类型

namespace Razor {
public class __CompiledTemplate {
public __CompiledTemplate() {
}
public override void Execute() {WriteLiteral("<div>\r\n\t");@foreach(var post in posts) {WriteLiteral("<div>");Write(post.Title);WriteLiteral("</div>");}WriteLiteral("\r\n</div>");}
}
}
 

最后,应用CodeDom API编译上面的代码,调用Execute方法输出结果。

Razor API

一开始接触这项技术时,以为是ASP.NET MVC的一个开源项目,接触之后才知道它是.NET Framework API中的类型,几年没有做Web开发,ASP.NET技术发展的确实很快。

System.Web.Razor.Parser.RazorParser

RazorParser用于解析脚本,但是它对Html,CS,VB脚本一无所知。MarkupParser用于解析Html标记,CSharpCodeParser用于解析包含C#代码的标记,相应的VBCodeParser则用于解析包含VB脚本的标记,

System.Web.Razor.Generator.RazorCodeGenerator

根据传入的Markup Parser,产生代码。与Parser相似,它也有二个与标记语言相关的类型,CSharpRazorCodeGenerator 和VBRazorCodeGenerator,用于处理标记包含的脚本。

System.Web.Razor.RazorEngineHost

System.Web.Razor.RazorTemplateEngine

引擎宿主,用于接受标记脚本,产生.NET 类型的代码。

把上面的内容综合起来,写一个例子程序,来看这些API的用法。

创建脚本宿主

var language = new CSharpRazorCodeLanguage();
var host = new RazorEngineHost(language) {DefaultBaseClass = "CustomTemplateBase",  DefaultClassName = "DemoTemplate",DefaultNamespace = "ProgrammingRazor",
};
 

添加Razor脚本引擎,读取标记(Markup)文件

RazorTemplateEngine engine = new RazorTemplateEngine(host);
GeneratorResults razorResult = engine.GenerateCode("C:\\Script.txt");

编译标记文件生成的类型,生成Code Dom 脚本

CompilerResults compilerResults =
new CSharpCodeProvider().CompileAssemblyFromDom(
               new CompilerParameters(/*...*/),razorResult.GeneratedCode
);

执行生成的程序集类型,获取结果

var template = (CustomTemplateBase)Activator.CreateInstance(“ProgrammingRazor.DemoTemplate”);
template.Execute();
 

Razor Pad程序的功能,也是用的这个基本思路来展来的。

Razor Pad是一个开放源码的程序,你可以从网址http://razorpad.codeplex.com中获取它的源代码。

 

转载于:https://www.cnblogs.com/JamesLi2015/p/3213642.html

理解模板引擎Razor 的原理相关推荐

  1. 前端进击笔记第十二节 掌握前端框架模板引擎的实现原理

    如今说起前端开发,基本上都离不开前端框架.随着前端技术不断迭代,前端框架相关的文档和社区日益完善,前端入门也越来越简单了.我们可以快速上手一些工具和框架,但常常会忽略其中的设计和原理. 对框架和工具的 ...

  2. 前端开发--art-template模板引擎及实现原理

    #博学谷IT学习技术支持# 目录 简介 安装 使用步骤 ​编辑 art-template标准语法 值输出 原文输出 条件输出 循环输出 过滤器 模板引擎的实现原理 1.基本语法 2.分组 3.字符串的 ...

  3. 高性能JavaScript模板引擎template.js原理解析

    点击有惊喜 artTemplate是新一代javascript模板引擎,它在v8中的渲染效率可接近javascript性能极限,在chrome下渲染效率测试中分别是知名引擎Mustache与micro ...

  4. 模板引擎的简单原理template

    ​var templateStr = "我的名字叫<%=name%>我是一只小狗,今年<%=age%>岁.";var data = {name:'旺财',a ...

  5. (转)浅谈dedecms模板引擎工作原理及自定义标签

    理解织梦模板引擎有什么意义?一方面可以更好地自定义标签.更多在于了解织梦系统,理解模板引擎是理解织梦工作原理的第一步.理解织梦会使我们写php代码时更顺手,同时能学习一些php代码的组织方式. 这似乎 ...

  6. php smarty 原理,php模板原理PHP模板引擎smarty模板原理浅谈

    mvc是开发中的一个伟大的思想,使得开发代码有了更加清晰的层次,让代码分为了三层各施其职.无论是对代码的编写以及后期的阅读和维护,都提供了很大的便利. 我们在php开发中,视图层view是不允许有ph ...

  7. JavaScript模板引擎原理,几行代码的事儿

    转自:http://barretlee.com/principle-of-javascript-template/ 一.前言 什么是模板引擎,说的简单点,就是一个字符串中有几个变量待定.比如: var ...

  8. [vue] 你知道vue的模板语法用的是哪个web模板引擎的吗?说说你对这模板引擎的理解

    [vue] 你知道vue的模板语法用的是哪个web模板引擎的吗?说说你对这模板引擎的理解 模板引擎: 负责组装数据,以另外一种形式或外观展现数据. 优点: 可维护性(后期改起来方便): 可扩展性(想要 ...

  9. PHP模板引擎的原理与实践

    0x00 模板引擎的原理 模板引擎就是在模板文件中使用一系列提前约定好的标签代替原生PHP代码,通过访问一个PHP的入口文件,会有一个PHP编译文件根据约定替换模板内标签以及标签内变量,最终将模板文件 ...

最新文章

  1. android 动态人脸识别码,android OpenCV研究之动态人脸识别
  2. 读书笔记:做人不要太老实读后感
  3. 重复制造--REM主数据
  4. response code 404 500
  5. python 文本相似度计算函数_四种计算文本相似度的方法对比
  6. 如果科学家封神,会有什么称号?
  7. Spring Boot 2.2 正式发布,大幅性能提升 + Java 13 支持
  8. java session使用_Java互联网架构-高负载集群架构如何解决session一致性问题
  9. 查看tsfresh提取(时间)序列特征的变量含义
  10. 旅游景点、住宿带餐饮一天一万多流水能做到吗?
  11. 更改项目文件夹图标(程序图标)
  12. 用友NC报表行数能否配置
  13. 邮件监控云上脚本执行进度
  14. antd mobile在微信公众号开发中使用笔记
  15. 魔兽世界怀旧服务器无限刷怪点,魔兽世界怀旧服50级刷怪地点汇总
  16. 清空KindEditor编辑器内容
  17. Hello Lyq And Xj
  18. 【C】转译日文乱码+右键上下文快速操作
  19. 软件项目技术路线图_为您的项目创建路线图
  20. 淘东电商项目(35) -SSO单点登录(登录功能完善)

热门文章

  1. iOS网络编程-配置iCloud-图文解说
  2. 【转】调试JavaScript 错误的解决方案
  3. Codeforces Round #555 (Div. 3) AB
  4. C# 泛型可能导致的装箱操作陷阱
  5. 字节数组输入流读取操作
  6. zend studio报错
  7. 响应式的无限滚动全屏dribbble作品集布局展示效果
  8. linux0.11学习笔记-技术铺垫-简单AB任务切换程序(3)-调试手段和方法
  9. HTTP自定义Header-(SOCKET-TCP)
  10. POJ2296二分2sat