14

我非常喜欢 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>
}

所以,编辑器给了我波浪线,表明我在开始<div>标签之前有一个结束标签。我可以忍受这一点。但是当我运行应用程序时,我实际上得到了以下运行时错误:

遇到没有匹配开始标签的结束标签“div”。您的开始/结束标签是否正确平衡?

显然,我不能忍受!那么处理这个案子有什么诀窍吗?就我想要的标记而言,我知道我在做什么。但 Razor 不这么认为,它正在接管。

为什么 MVC 会浪费循环检查平衡标签?

4

2 回答 2

13

由于我不明白的原因,以下更正了该问题:

@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>
}

注意@:前几个标签的添加。我不知道为什么这些是必要的——Razor 突出显示它识别出这些是标签而不是代码。

另外,为什么这会使错误消失?导致运行时错误的东西没有改变。也许有人可以为我填补空白。

于 2012-05-16T00:13:32.663 回答
7

您需要在标记前添加@:(如标记答案中所标识)。此博客条目解释了其原因:

http://weblogs.asp.net/scottgu/archive/2010/12/15/asp-net-mvc-3-razor-s-and-lt-text-gt-syntax.aspx

来自博客:

Razor 用于隐式识别代码块何时结束的技术之一是查找标记/元素内容以表示内容区域的开始。

但是,并非所有内容容器块都以标记元素标记开头,并且存在 Razor 解析器无法隐式检测内容块的情况。

Razor 通过使您能够使用代码块中的 @: 字符序列显式指示内容行的开头来解决此问题。@: 序列表示后面的内容行应被视为内容块:

于 2013-02-25T14:29:39.477 回答