博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
理解模板引擎Razor 的原理
阅读量:5218 次
发布时间:2019-06-14

本文共 2625 字,大约阅读时间需要 8 分钟。

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对象的标题:

@foreach(var post in Posts) {
@post.Title
}

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

\r\n\t
@
foreach(var post in posts) {
@
post.Title
}
\r\n

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

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

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

最后,应用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是一个开放源码的程序,你可以从网址中获取它的源代码。

 

 

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

你可能感兴趣的文章
JavaScript(三) 数据类型
查看>>
移动端rem布局屏幕适配插件(放js中便可使用)
查看>>
Docker
查看>>
bzoj2259 [Oibh]新型计算机
查看>>
对位与字节的深度认识
查看>>
C++编程基础二 16-习题4
查看>>
MongoDB遇到的疑似数据丢失的问题。不要用InsertMany!
查看>>
服务器被疑似挖矿程序植入107.174.47.156,发现以及解决过程(建议所有使用sonatype/nexus3镜像的用户清查一下)...
查看>>
JQuery 学习
查看>>
session token两种登陆方式
查看>>
C# ArrayList
查看>>
IntelliJ IDEA 12集成Tomcat 运行Web项目
查看>>
java,多线程实现
查看>>
个人作业4-alpha阶段个人总结
查看>>
android smack MultiUserChat.getHostedRooms( NullPointerException)
查看>>
递归-下楼梯
查看>>
实用的VMware虚拟机使用技巧十一例
查看>>
监控工具之---Prometheus 安装详解(三)
查看>>
Azure Iaas基础之---创建虚拟机
查看>>
不错的MVC文章
查看>>