【问题标题】:ASP.NET MVC Razor Won't Accept My Valid MarkupASP.NET MVC Razor 不接受我的有效标记
【发布时间】:2012-05-23 12:46:02
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 我不知道...我搜索了一下,发现其他人提出了相同的答案。 ?
  • @gdoron:和什么答案一样?

标签: asp.net asp.net-mvc razor


【解决方案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>
}

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

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

【讨论】:

  • 我认为有效的语法实际上更具可读性,显然 Razor 同意 ;) Razor 有时会感到困惑。这就是存在这样的转义序列的原因。
  • 我有时也会感到困惑。 :) 如果是 Razor 问题,那么为什么会产生运行时错误。这对我来说毫无意义。
  • @JonathanWood 感谢您的回答。但在视觉工作室中,如果我按 ctrl + k + D 对齐代码,它会将其重新格式化为 @: (
    正在移动到下一行)。所以再次造成同样的错误
  • @RahulNikate:是的,Razor 在某些情况下会有点困惑。
  • 【解决方案2】:

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

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

    来自博客:

    Razor 用来隐式识别何时 代码块结束是寻找标记/元素内容来表示 内容区域的开头。

    不过,并非所有内容容器块都以标签元素标签开头, 并且存在 Razor 解析器无法隐式检测的场景 一个内容块。

    Razor 通过让您明确指出 使用 @: 字符序列开始一行内容 在一个代码块内。 @: 序列表示该行 后面的内容应被视为内容块:

    【讨论】:

      猜你喜欢
      • 2011-06-25
      • 1970-01-01
      • 2012-08-04
      • 2021-05-10
      • 2012-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多