似乎无法使用Razor的foreach和if语句有条件地创建新的表行?

时间:2011-04-20 16:54:45

标签: asp.net-mvc-3 razor

我想要一个循环来动态创建一个最多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语句都需要。如果我将标签更改为其他标签(例如),它可以正常工作。

我的猜测是它试图验证行的结尾,看到它并决定循环必须结束?我怎么能不这样做,或者我是否需要将整个表放在循环中并带有一堆杂乱的条件? :(

3 个答案:

答案 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)">&nbsp;</td>
    }
  </tr>
</table>