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内幕之解析

查看原文,点击此处。

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

[译]Razor内幕之介绍相关推荐

  1. [译]Core Animation 3D介绍(第2部分)

    尊重原创 转自:http://codingobjc.com/blog/2013/06/24/core-animation-3djie-shao-di-2bu-fen/ 在上一篇教程中,我们已经学习了C ...

  2. [译]Core Animation 3D介绍(第1部分)

    尊重原创 转自:http://codingobjc.com/blog/2013/06/11/core-animation-3djie-shao-di-1bu-fen/ 在本教程中,我将向你介绍Core ...

  3. [译]LINT TO SQL 介绍(数据库查询) - Part.3

     PDF版浏览:http://files.cnblogs.com/JimmyZhang/Linq-To-Sql-Part_3-Querying-our-Database.pdf 出处:Linq To ...

  4. [译] Fiber内幕:深入概述React新的协调算法

    原文地址:medium.com/react-in-de- 如何以及为何从React组件到Fiber节点的一切内容 React使用一个构建用户界面的JavaScript库,它的核心机制是跟踪组件状态的的 ...

  5. mariadb导入sql数据_「译」关系型数据库介绍

    原文来自MariaDB官网的基础知识储备库中关系型数据库的介绍,原文链接:https://mariadb.com/kb/en/library/introduction-to-relational-da ...

  6. [译]Java 垃圾回收介绍

    说明:这篇文章来翻译来自于Javapapers 的Java Garbage Collection Introduction 在Java中,对象内存空间的分配与回收是由JVM中的垃圾回收进程自动完成的. ...

  7. 【译】Part 1: 介绍和安装

    原文地址:Part 1: Introduction and Installation 原文作者:Naveen R 译者:jacsice 转载请注明出处.更多进阶译文请查看咔叽咔叽 这是golang入门 ...

  8. (译)SAP APO介绍

    1 SAP APO 基础 1.1 什么是SAP APO SAP APO 全称是SAP Advanced Planner and Optimizer(SAP 高级计划优化器).SAP APO是供应链计划 ...

  9. 《WCF技术内幕》翻译1:《WCF技术内幕》目录和作者简介

    翻译序言: 我现在推荐一本很好的WCF学习书籍:<Inside Microsoft Windows Communication Foundation>.Justin Smith先生所著.2 ...

最新文章

  1. 软工作业——四则运算生成器(scala 实现)
  2. 如何在 Windows XP 的事件查看器中查看和管理事件日志
  3. spring—AOP 的动态代理技术
  4. UITableView 性能优化
  5. html多个单元格合并单元格内容,excel怎样快速把多个单元格内容合并 合并多个单元格内容的设置方法...
  6. java 策略模式 促销_java设计模式——策略模式
  7. mysql 安装问题汇总_Windows 10 下MySQL安装及常见问题
  8. 精选PHP毕业设计12套——源码+论文完整资源
  9. 【C语言程序设计(2020版)】C语言基础入门教程,零基础教学视频教程
  10. 关于“如何使用FFT计算天线阵列方向图”的学习资料总结
  11. 浅尝大菠萝Pinia
  12. WTL 自绘控件库 (CQsRadioBox)
  13. 绿色便携版谷歌浏览器制作流程
  14. H-1B visa - H-1B 签证
  15. 绕过CDN查询真实IP
  16. 请不要在该奋斗的年纪选择了安逸
  17. 【Elang】dialyzer
  18. 【spring MVC】解决spring MVC不支持PUT请求
  19. 线性回归模型的度量参数1- SST SSR SSE R-Squared
  20. 正则表达式-匹配横杠-本身

热门文章

  1. 解决 GiWiFi 普通用户无客户端无法登入
  2. 中upload依赖包_upload-labs writeup
  3. JavaScript 常用Array、String方法
  4. 我的世界服务器不显示浮空字,我的世界服务器浮空字怎么做 | 手游网游页游攻略大全...
  5. java布类型的常量,java数据类型;常量与变量;
  6. python识别复杂验证码2020_Python识别验证码!学会这步,百分之60的网站你基本都能识别了!...
  7. ubuntu18 防火墙关闭_Ubuntu防火墙怎么关闭或打开?
  8. android meminfo,Android中dumpsys meminfo与/proc/meminfo获取空闲内存不一致的问题
  9. github访问慢解决办法
  10. sot23-6 随机数生成芯片,i2c接口