日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

理解模板引擎Razor 的原理

發布時間:2025/6/17 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 理解模板引擎Razor 的原理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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 的原理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。