Jon*_*ood 13 asp.net asp.net-mvc razor
我非常喜欢Razor语法,但它肯定不够完美.例如,我有以下标记块.
@if (Model.FeaturedDestinations != null && Model.FeaturedDestinations.Count() > 0)
{
int column = 0;
foreach (var d in Model.FeaturedDestinations)
{
column++;
if (column > 4)
{
</div>
@{ column = 1; }
}
if (column == 1)
{
@:<div class="row-fluid">
}
<div class="span3">
@RenderDestination(d)
</div>
}
</div>
}
Run Code Online (Sandbox Code Playgroud)
因此,编辑器给了我波浪线,表明我在开始<div>之前有一个结束标记.我可以忍受这一点.但是当我运行应用程序时,我实际上得到以下运行时错误:
遇到没有匹配开始标记的结束标记"div".您的开始/结束标签是否正确平衡?
显然,我不能忍受那个!处理这个案子有什么诀窍吗?我知道我正在做什么,就像我想要的标记一样.但Razor并不这么认为,它正在接管.
为什么MVC浪费周期检查平衡标签?
Jon*_*ood 11
由于我不明白的原因,以下更正了问题:
@if (Model.FeaturedDestinations != null && Model.FeaturedDestinations.Count() > 0)
{
int column = 0;
foreach (var d in Model.FeaturedDestinations)
{
column++;
if (column > 4)
{
@:</div>
column = 1;
}
if (column == 1)
{
@:<div class="row-fluid">
}
<div class="span3">
@RenderDestination(d)
</div>
}
@:</div>
}
Run Code Online (Sandbox Code Playgroud)
注意@:在几个标签之前添加.我不知道为什么这些是必要的 - 剃刀突出显示它认识到这些是标签而不是代码.
另外,为什么这会导致错误消失?导致运行时错误的事情没有改变.也许有人可以为我填补空白.
您需要在标记前面添加@:(在标记的答案中标识).此博客条目解释了其原因:
http://weblogs.asp.net/scottgu/archive/2010/12/15/asp-net-mvc-3-razor-s-and-lt-text-gt-syntax.aspx
来自博客:
一的该剃刀使用隐式地识别何时一个代码块结束的技术是寻找标记/元素含量来表示一个内容区域的开始.
和
但是,并非所有内容容器块都以标记元素标记开头,并且存在Razor解析器无法隐式检测内容块的情况.
Razor通过使用代码块中的@:字符序列显式指示内容行的开头来解决此问题.@:序列表示后面的内容行应被视为内容块:
| 归档时间: |
|
| 查看次数: |
5143 次 |
| 最近记录: |