剃刀丢失关闭支撑/标记

时间:2012-09-03 08:26:43

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

在我的视图中Razor告诉我,我的Foreach循环缺少一个结束括号(})    它还告诉我我的<div class="row">缺少其结束标记。

 @{int spanCounter = 0;}
 @foreach (var item in Model)
 {
     if(spanCounter == 0)
     {
        <div class="row">
     }
     spanCounter += item.Span;

     <div class="span@(item.Span)">
       @item.Html
     </div>

     @if(spanCounter == 12)
     {
       @spanCounter = 0

       </div>
     }    
 }

我见过类似的问题,但他们似乎关注Razor希望适当分层的事实。即,这是非法的:

if(condition)
{
    <foo>
}
else
{
    <foo>
}
</foo>

更新 该模型是Html内容“块”列表

为了更清楚一点,我想在<div></div>“行”中写出多个块(<div></div>

  1. 如果spanCounter为0 BEGIN行。
  2. 写内容:<div></div>阻止,直到达到最大跨度宽度(12)
  3. 结束行,重置计数器,返回1.

4 个答案:

答案 0 :(得分:3)

还有另一种方法可以避免重复代码:

if(condition)
{
    @:<foo>
}
else
{
    @:<foo>
}
</foo>

答案 1 :(得分:2)

像这样替换

@{int spanCounter = 0;}
@foreach (var item in Model)
{
  if (spanCounter == 0 || spanCounter == 12)
  {
  <div class="row">
  @spanCounter += @item.Span;
  <div class="span@(item.Span)">
      @item.Html
  </div>
  </div>
  }
  else
  {
    spanCounter += item.Span;
  <div class="span(@item.Span)">
  @item.Html
  </div>
  }
}

答案 2 :(得分:0)

您收到此错误的原因是有条件地呈现了结束标记,因此您无法保证将其添加到视图中:

spanCounter变量在这里递增:

    spanCounter += item.Span;

    <div class="span@(item.Span)">
       @item.Html
    </div>

因此,你不能保证它符合这个if语句的条件,即此时它可能大于12:

    @if(spanCounter == 12)
    {
       </div>
    }    

您需要为有条件渲染的元素提供完整标记。你需要这样的东西:

var spanCounter = 0;
<div class="row">

@foreach (var item in Model)
{
    spanCounter += item.Span;
    <div class="span@(item.Span)">
        @item.Html
    </div>
   if(spanCounter == 12)
   {
       spanCounter = 0;
   }
}

</div>

答案 3 :(得分:0)

这并没有解决你的代码本身,但它与Razor对闭合支撑的混淆有关,所以我把它放在这里以防万一有人真的像我一样难倒。在VS 2012中,Razor感到困惑,我最终在评论中将其缩小为撇号,就像这样。注意闭合支撑不是黄色的:

enter image description here

但如果你从评论中省略了撇号,它就可以了:

enter image description here