[译]Razor内幕之介绍

Razor语法的主要设计目标是:让代码和标记流能够一起工作同时尽量不与控制字符冲突。例如,下面的ASPX代码:

<ul>  

    <% foreach(var p in Model.Products) { %>  

    <li><%= p.Name %> ($<%= p.Price %>)</li>  

    <% } %>  

</ul>  

现在,我们仅留下我们实际上关注的东西,去除额外的ASPX控制字符,处理后的代码如下:

<ul>  

    foreach(var p in Model.Products) {  

    <li>p.Name ($p.Price)</li>  

    }  

</ul>  

很显然,上面的代码中并没有足够的信息来决定那些是代码,那些是标记。Razor引擎在设计的时候希望加入尽量少的信息来分辨上面代码中的代码和标记。基于Razor引擎的页面包含了代码、标记及尽量少的额外标记。因此使用C#Razor语法,上面的代码变成了:

<ul>  

    @foreach(var p in Model.Products) {  

    <li>@p.Name ($@p.Price)</li>  

    }  

</ul>  

这并不是对ASPX语法的一种缝补,Razor利用对C#(或者VB)和HTML语法的充分理解来推断你要写的代码。继续上面的例子,让我们一步一步的看Razor是如何解析它的。

<ul>  

Razor会一直向前解析直到遇到"@"字符,所以这行Razor会把<ul>归类为标记并转到下一行进行处理。

@foreach(var p in Model.Products) {  

现在Razor发现了一个"@"字符,"@"字符是Razor中的一个魔力字符,不像ASPX中的"<%=%>",它只有一个字符,接下来解析器会计算出剩下的内容。在ASPX中,我们通过"%>"来声明代码块的结束,但是Razor并没有自己的语法来声明代码块的结束。Razor通过最少匹配模式和基于语言的语法来决定代码块的结束。在上面的情况中,Razor知道C#中的foreach声明包含在"{"和"}"字符中,所以当foreach声明结束的时候,解析引擎返回标记状态。

<li>@p.Name ($@p.Price)</li>  

刚才说过解析器在到达foreach结束之前会处于代码模式,那这段代码如何处理呢?这段代码更像是标记但我们却还在foreach声明代码块中。事实上,这是Razor使用基于语言的语法推断你意图的另一种情况,我们知道在"{"字符之后会有一些声明语句,但是,我们发现了"<li>"标记而不是声明语句,此时Razor会推断出你实际上是想切换到标记解析而不是代码解析状态。所以我们实际上得到的是有三种上下文信息的栈:首先是标记状态;通过@foreach切换到代码状态,通过"<li>"切换回标记状态;在"<li>"标记结束的时候推断出已回到foreach主体的代码状态。

}  

然后解析到foreach语句块的结束"}"字符,回到标记上下文。

</ul>  

接下来我们继续解析标记直到遇到下一个"@"字符或者到达文件结尾。

查看下一篇:Razor内幕之解析

查看原文,点击此处

注:如果发现有翻译不恰当或者疏漏的地方请反馈给我,我会及时更正,谢谢!

posted @ 2010-08-18 15:18  镜涛  阅读(1844)  评论(3编辑  收藏  举报
Creative Commons License

本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名孙镜涛(包含链接)。如您有任何疑问或者授权方面的协商,请给我留言