我目前的项目中有很多复杂的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视图引擎时就是这种情况。
答案 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!
}