Razor View Engine:复杂的循环和HTML

Mik*_*erg 28 asp.net-mvc razor asp.net-mvc-3

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

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

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

然而,Razor声称:"foreach循环缺少关闭"}"字符".(在Visual Studio中)

我一直在努力,包裹<tr><text></text>这使得收盘}问题消失在运行时只发现这一点:"遇到结束标记'TR’没有匹配的开始标记是你的开始/结束标记适当的平衡".

在说服Razor根本不打扰HTML时,我将如何进行这种条件渲染,因为当所有循环完成时HTML都是平衡的.或者至少在使用ASP.NET视图引擎时就是这种情况.

Dar*_*rov 35

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

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

恕我直言,在视图中有如此多的条件逻辑是滥用.你绝对应该考虑使用HTML助手或控件,如MVCContrib Grid.


更新:

您可以尝试以下hack:

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

  • 在您的更新中投票赞成@:选项,我不认为是黑客. (6认同)

mar*_*ind 6

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

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

@foreach (var ourItem in ourList) {
   <tr>
   <td>...</td>
   </tr>
}
Run Code Online (Sandbox Code Playgroud)

虽然标签可能会在生成的标记中达到平衡,但您提供的源代码很难推断其正确性.