ASP.NET MVC Razor不会接受我的有效标记

时间:2012-05-15 23:47:58

标签: 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>
}

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

  

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

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

为什么MVC浪费周期检查平衡标签?

2 个答案:

答案 0 :(得分: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>
}

请注意在多个标记之前添加@:。我不知道为什么这些是必要的 - Razor突出显示它认识到这些是标签而不是代码。

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

答案 1 :(得分:5)

您需要在标记前面添加@:(在标记的答案中标识)。这篇博客文章解释了原因:

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

来自博客:

  

Razor用于隐式识别何时使用的技术之一   代码块结尾是查找标签/元素内容来表示   内容区域的开头。

  

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

     

Razor通过让您明确指出来解决这个问题   使用@:字符序列开始一行内容   在代码块中。 @:序列表示该行   以下内容应被视为内容块: