ASP.NET MVC剃刀不接受我的有效标记(ASP.NET MVC Razor Won't

2019-07-29 10:25发布

我喜欢的剃刀语法很多,但它肯定达不到完美。 例如,我有标记以下块。

@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>开一个标记之前。 我可以忍受这一点。 但是,当我运行应用程序时,我居然得到以下运行时错误:

遇到结束标记“格”没有匹配的开始标记。 是你的开始/结束标记适当的平衡?

很显然,我不能忍受的! 那么,有没有处理这种情况下,任何把戏? 我知道,只要我想要标记我在做什么。 但剃刀不这么认为,它的接管。

为什么到底是MVC浪费周期检查平衡的标签?

Answer 1:

至于原因,我不明白,下面修正了该问题:

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

注意添加@:前几个标签。 我不知道为什么这是必要的 - 剃刀突出表明,它承认这些人的标签,而不是代码。

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



Answer 2:

您需要添加@:在标签的正面(在标注答案标识)。 此博客条目解释其中的原因:

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

从博客:

一的该剃刀使用隐式地识别何时一个代码块结束的技术是寻找标记/元素含量来表示一个内容区域的开始。

并非所有内容的容器块用标签元素标签开始,不过,也有场景中的剃刀解析器不能隐式检测内容块。

字符序列的代码块中:剃刀使您能够明确地表示行的内容的开头使用@解决了这个。 在@:序列表示的内容后面的线应作为一个内容块进行处理:



文章来源: ASP.NET MVC Razor Won't Accept My Valid Markup