我想要一个循环来动态创建一个最多2列宽的表,然后增加行数,直到列表中没有任何条目。听起来很简单,我想出了这个:
<table>
<tr>
@{ var i = 0; }
@foreach (var tm in Model.TeamMembers)
{
<td>@tm.FirstName @tm.LastName @tm.Role</td>
if(++i % 2 == 0)
{
</tr>
<tr>
}
}
</tr>
</table>
但我得到错误说明}对于for循环和if语句都需要。如果我将标签更改为其他标签(例如),它可以正常工作。
我的猜测是它试图验证行的结尾,看到它并决定循环必须结束?我怎么能不这样做,或者我是否需要将整个表放在循环中并带有一堆杂乱的条件? :(
答案 0 :(得分:28)
试试这样:
@{ var i = 0; }
@foreach (var tm in Model.TeamMembers)
{
<td>@tm.FirstName @tm.LastName @tm.Role</td>
if(++i % 2 == 0)
{
<text></tr><tr></text>
}
}
或:
@{ var i = 0; }
@foreach (var tm in Model.TeamMembers)
{
<td>@tm.FirstName @tm.LastName @tm.Role</td>
if(++i % 2 == 0)
{
@:</tr><tr>
}
}
答案 1 :(得分:1)
Razor希望将C#代码后面的HTML代码包含在一对html标记中。在这里你首先得到结束标记,然后是开始标记,这就是剃刀在解析文本时遇到问题的原因。
如Darin指出的那样,将你的html代码块包含在内就可以解决这个问题。
您可以阅读Phil Haacked http://haacked.com/archive/2011/01/06/razor-syntax-quick-reference.aspx
的快速指南答案 2 :(得分:1)
在Razor语法中,您可以使用@:插入文字文本。
@:This allows literal text & arbitrary html
您可以在下面发布的解决方案中看到这是如何实现的。它正确地关闭表,每行有正确数量的表格单元格。
我需要一个能够绑定所选值的表格单选按钮列表。
@{
int iSelectedId = (int)ViewData["SelectedMember"];
long iCols = 3;
long iCount = Model.TeamMembers.Count();
long iRemainder = iCount % iCols;
decimal iDiv = iCount / repeatCols;
var iRows = Math.Ceiling(iDiv);
}
<table>
<tr>
@for (int i = 0; i < iCount; i++)
{
var tm = Model.TeamMembers[i];
<td><input type="radio" name="item" value="@(tm.Id)" @(tm.Id == iSelectedId) ? "checked=checked" : "") /> @(tm.FirstName) @(tm.LastName)) - @(tm.Role) </td>
if (i % iCols == iCols -1 && i < iCount - 1)
{
//The alternate syntax for adding arbitrary text/html @:
//was crucial in getting this to work correctly.
@:</tr><tr>
}
}
if (iRem > 0)
{
<td colspan="@(iCols - iRem)"> </td>
}
</tr>
</table>