Razor视图引擎之语法剖析1

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

下面的ASPX代码:

<ul>

<%foreach(varpinModel.Products){%>

<li><%=p.Name%>({$selection}lt;%=p.Price%>)</li>

<%}%>

</ul>

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

<ul>

foreach(varpinModel.Products){

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

}

</ul>


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

<ul>

foreach(varpinModel.Products){

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

}

</ul>

 

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

<ul>

@foreach(varpinModel.Products){

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

}

</ul>


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

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

@foreach(varpinModel.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>

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


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值