【发布时间】:2011-01-24 12:22:00
【问题描述】:
在我当前的项目中,我有很多复杂的 HTML 报告,在那里我们使用行跨度和列跨度对 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 视图引擎时是这种情况。
【问题讨论】:
-
从您的代码看来,整个 tr 和 /tr 片段不应该在相同的 if 条件内。我没有使用剃须刀,但您所显示的内容似乎令人困惑。如果不满足条件,则 /tr 标签将第一个 tr 作为起始标签,如果满足条件,则它用于第二个 tr 标签,而第一个标签没有相应的 /tr 标签。只是我观察到的。
-
上面的代码可能很笨,但它是有效的。无论如何呈现为 HTML 时。我在这里试图证明的一点是,即使呈现的结果是有效的 HTML,Razor 也会进入并破坏它,因为它无法接受它认为会产生的奇怪语义。
-
@sassyboy 如果 ourList 非空,那么应该总是有匹配的 trs。打开的 tr 要么是列表中第一项的循环外的一个,要么是后续项的条件内的一个。
-
为了将事情保持在最低限度,这是我们必须关注的代码。让我们假设列表是非空的。鉴于此,我想制作 Razor 来渲染它。
标签: asp.net-mvc asp.net-mvc-3 razor