项目中前台用的是asp.net mvc3,Razor引擎(关于Razor的介绍可以参考:http://weblogs.asp.net/scottgu/archive/2010/07/02/introducing-razor.aspx),深深体验到了Razor引擎的方便强大。但在编码过程中也遇到了一些问题,就是Razor的@标记,这个标记到底什么时候该加什么时候不该加呢?

  先看一段代码(只是为了说明问题用,没任何意义)吧:

代码一:

 1 <div> 2     for(int i=0;i<3;i++) 3     { 4         </div>i<div> 5         for(int j=0;j<3;j++) 6         { 7             if(j==1) 8 { 9                 <div>10                     for(int k=0;k<5;k++)11                     {12                         k++;13                         <span>14                             k15 </span>16                     }17 </div>18                 break;19             }20         }21     }22 </div>

  这一段代码没添加任何@标记,肯定是有问题的,你能准确地判断出这段代码中哪些地方要添加@标记吗?看到这里,停几分钟,填上你的答案吧:),然后把你的答案跟下面的参考答案做个对比吧,如果你很确定地完成了并且完全正确,那么恭喜你,这个知识点你已经掌握了,下面的内容你可以直接跳过了。

  参考答案:

参考答案

 1 <div> 2     @for(int i=0;i<3;i++) 3     { 4         @:</div>@i<div> 5         for(int j=0;j<3;j++) 6         { 7             if(j==1) 8 { 9                 <div>10                     @for(int k=0;k<5;k++)11                     {12                         k++;13                         <span>14                             @k15 </span>16                     }17 </div>18                 break;19             }20         }21     }22 </div>

  亲,做错的童鞋有木有,有木有。做错了也没什么关系啦,我之前也错了呢,这里给出一个小小的规则(自己定义的,不一定准确,如果已经有专用名词欢迎大家指出),掌握这个小规则后你就很容易做对了。

  Razor语法中有block(块)的说法,这个大家应该都不陌生了,就是代码段,如我们可以把using(){}包起来的代码叫一个block(段/块),block内部还可以有block,这个是可以嵌套的。比如上面的示例代码中我们可以把最外层的for循环内部的代码(第2行到第21行)是一个block,第4行是一个代码块,第二个for循环内部的代码(第5行到第20行)也可以叫一个block,划分不是固定的,粒度你可以自己定义。

  block内部的代码分为两种,一种是HTML代码块,一种是C#(本例中为C#,也可以是其他.NET语言)代码块。有了block的概念后,Razor中@标记的规则就是:

如果同一种代码块(HTML代码块不需要加@,这里排除开)内部跟的是同类代码块,这时不需要加@标记,否则要加@标记

  用这个规则逐一解析一下上面的代码,在解析之前我的block划分是这样的:

  第1—22行,2—21行,第4行,5—20行,7—19行,9—17行,10—16行,12行,13—15行,14行

  我们从里往外看,第14行外层block是HTML代码,所以第14行要加@,12行外层block也是C#代码块,因此不加,以此类推,直到第5行,这一行有点特殊,这个涉及到VS中的标签匹配。

  我们知道VS能在编码时对HTML标签进行匹配,这个匹配只是给出警告,并不是强制的,用了Razor后,混在C#(也可以是其他语言)中的HTML标签也要进行匹配,只是这个匹配是在代码块内部进行的,同时也是野蛮的,如果不匹配就会出错,例如下面的代码是通不过的:

1 <div>2 <tr>3     @if(true)4     {5 </tr>6     }7 </div>

  错误页面:

  改为这样就好了:

1 <div>2 <tr>3     @if(true)4     {5 <tr></tr>6     }7 </div>

  那么如果遇到像最开始那段代码</div><div>这样进行拼接的HTML怎么办呢,Razor提供了两种方案,一是在前面加上“@:”,如 @:</div><div>;一是用@Html.Raw,如:@Html.Raw("</div><div>");

  了解了这点后代码一第4行就应该这样:@:</div>@i<div>,第4行没问题了,最后只剩第5行了,这时直接把第4行忽略,按规则写就OK了,因为第2行是C#代码块,因此第5行不需要添加@。

  好了,写到这里只剩最后一个点了,如果把代码一中第4行改为<div>i</div>,那么第5行应该是什么样的呢?如果Razor内HTML标签是匹配的,Razor可以识别,这时可以忽略匹配的HTML标签对即可。

  规则有时并不是万能的,极个别的还是要经过尝试,最后说个小小的技巧,可以把Razor代码背景颜色改一下,这样就能比较容易地识别了:

  欢迎大家留言讨论,给出更优的解决方案。

转载于:https://www.cnblogs.com/artwl/archive/2011/07/29/2120941.html

asp.net mvc3 Razor引擎中@使用规则小记相关推荐

  1. ASP.NET MVC3 Razor视图引擎-基础语法

    I:ASP.NET MVC3在Visual Studio 2010中的变化 在VS2010中新建一个MVC3项目可以看出与以往的MVC2发生了很明显的变化. 1.ASP.NET MVC3必要的运行环境 ...

  2. [转]]将 ASP.NET MVC3 Razor 项目部署到虚拟主机中

    原链接:http://www.cnblogs.com/taven/archive/2011/08/14/2138077.html 国内很多网站空间都只支持.NET 2.0 和 .NET 3.0 3.5 ...

  3. Asp.net MVC3 Razor语法小记

    1.在MVC View中使用 三元运算符的方式:@(bool?"":"") 2.在@{}中输出一行:@:<html> 3.Radio默认选中: @H ...

  4. 【转载】Asp.Net MVC3网站并成功的连接了MongoDB

    http://www.cnblogs.com/leo_wl/archive/2012/02/10/2345890.html 我们已经创建了一个简单的Asp.Net MVC3网站并成功的连接了Mongo ...

  5. 爱上MVC~Razor引擎时,在遍历中巧用Output.Write方法

    回到目录 在Razor引擎中,对于在表格中进行遍历时,一般会这样写 <table border="1">@{ for (var i = 0; i < 10; i+ ...

  6. Razor引擎学习:RenderBody,RenderPage和RenderSection

    ASP.NET MVC 3 已经正式发布了,现在估计许多人都在拼命学,我也不能例外,刚刚看到了一篇文章,介绍了三个非常有用的方法:RenderBody,RenderPage和RenderSection ...

  7. ASP.NET Core Razor页面禁用防伪令牌验证

    这篇短文中,我将向您介绍如何ASP.NET Core Razor页面中禁用防伪令牌验证. Razor页面是ASP.NET Core 2.0中增加的一个页面控制器框架,用于构建动态的.数据驱动的网站:支 ...

  8. ASP.NET中添加View与Razor引擎以及View解析和Controller向View传值

    场景 ASP.NET中MVC添加Controller以及访问其Action: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/106 ...

  9. ASP.NET MVC 3: Razor视图引擎中 @: 和text 语法【转载】

    ASP.NET MVC 3: Razor视图引擎中 @: 和<text> 语法[转载] (文章没翻译:建议大家读英文原文,看不懂查着看,顺便提高自己的英语水平!) In today's p ...

最新文章

  1. mysql数据库空闲时间设定_关于数据库连接池的最大空闲时间的配置
  2. CentOS 7.1云服务器 配置FTP服务器vsftpd
  3. leetcode28. 实现strStr()
  4. 【详解】某企业的培训关系模式 R(培训科目,培训师,学生,成绩,时间,教室), R的函数依赖集 F={培训科目→→培训师,(学生,培训科目)→成绩,(时间,教室)→培训科目,(时间,培训师)→
  5. SQL Server:Like 通配符特殊用法:Escape
  6. .NET 现代化动态 LINQ 库 Gridify
  7. ECS 控制台诊断系统
  8. Vue 安装 live-server
  9. Eclipse开发常用快捷键
  10. XNA中的中文输入(一)
  11. 利用 TypeConverter,转换字符串和各种类型只需写一个函数
  12. kickstart实现网络安装centos6.3系统
  13. CodeforcesRound#498 (Div.3)E题Military Problem
  14. Python实现pdf转图片
  15. java 实现短信验证码功能
  16. 软件测试自学还是培训?
  17. h标签,b标签,em,i ,u,s标签
  18. android studio在夜神上打开_Android Studio之使用连接夜神模拟器分析Smail 【详文】8.7日更正...
  19. iTerm2 + oh-my-zsh + powerlevel9k 打造你喜欢的编码终端
  20. linux shell 安装curl,bash – 不能使用curl安装NPM

热门文章

  1. idea中如何打开RunDashboard窗口,微服务最实用设置
  2. 根据JSON自动生成select联动
  3. 先验概率,后验概率,条件概率,贝叶斯
  4. 北京大学开源分词工具pkuseg 初试与使用感受
  5. 8080CPU寄存器划分
  6. 处理器解决物联网和人工智能的融合
  7. AttributeError: module ‘os‘ has no attribute ‘mknod‘
  8. Tablayout 修改默认选项页,或者跳转到指定的选项页
  9. 如何在Fragment中使用findViewById
  10. Unable to inject views for 包名.activity