Razor View Engine:复杂的循环和HTML

时间:2011-01-24 12:22:00

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

我目前的项目中有很多复杂的HTML报告,我们使用rowpans和colspans对TR和TD进行大量条件渲染。

它有时看起来像这样(这是非常简化的):

<tr>
@foreach (var ourItem in ourList) {
   if (ourItem != ourList.First()) {
      <tr>                
   }
   <td></td>
   </tr>
}

然而,Razor声称:“foreach循环缺少结束”}“字符”。 (在Visual Studio中)

我试图将<tr>包裹在<text></text>中,这使得关闭}问题消失,只有在运行时找到它:“遇到结束标记”tr“,没有匹配的开始标记。你的开始/结束标签正确平衡“。

在说服Razor根本不打扰HTML时,如何进行这种条件渲染,导致HTML在所有循环完成时保持平衡。或者至少在使用ASP.NET视图引擎时就是这种情况。

4 个答案:

答案 0 :(得分:35)

Visual Studio智能感知和语法突出显示不是最好的之一,但在这种情况下,它会警告您,如果条件不满意,您可能会得到无效的标记,您不应该因此而责备它。

重要的是你的项目运行正常,但你可能会考虑将这个逻辑外化到HTML助手中,因为如果你说的是真的,这是你在视图中所拥有的简化版本,我甚至不想想象你的实际代码是怎样的。

恕我直言,在视图中有如此多的条件逻辑是滥用。您绝对应该考虑使用HTML帮助程序或控件,例如MVCContrib Grid


更新:

您可以尝试以下黑客攻击:

<tr>
@foreach (var ourItem in ourList) {
   if (ourItem != ourList.First()) {
      @:<tr>                
   }
   @:<td></td>
   @:</tr>
}

答案 1 :(得分:6)

Razor依赖于匹配标记来确定代码和标记之间的自动转换。你不能“禁用”Razor的这个功能(至少在没有重写Razor解析器的大部分的情况下)。

你可以使用Darin的建议解决它,虽然我不明白(至少不是你的简化例子)为什么你的观点需要如此复杂。为什么不写下面的代码:

@foreach (var ourItem in ourList) {
   <tr>
   <td>...</td>
   </tr>
}

虽然标签可能会在生成的标记中达到平衡,但您提供的来源很难说明其正确性。

答案 2 :(得分:4)

尝试使用rowspan并尝试获取类似

的结构时
<table>
   <tr>
       <td rowspan=2>1:st col</td>
       <td>2:nd col</td>
   </tr>
   <tr>
       <td>2:nd col</td>
   </tr>
</table>

你可以尝试:

@{ 
    var ourList = new List<string> { "1", "2", "3" };
}

<table border=1>
@foreach(var ourItem in ourList){
    <tr>
    @if (ourItem == ourList.First())
    {
        <td rowspan="@ourList.Count()">@ourItem</td>
    }
    <td>@ourItem</td>
    </tr>
}
</table>

答案 3 :(得分:4)

我有类似的问题 - 我的解决方案Html.Raw(“”);

    if (isTrue)
    {
        <text><div></text> }
   ...

    if(isTrue) {
        @Html.Raw("</div>"); // <-- closing tag!
        }