【问题标题】:New Table row every 4th loop每 4 个循环新表行
【发布时间】:2012-10-05 21:49:47
【问题描述】:

如何在 Razor 视图的每 4 个循环中创建一个新表行?这是为 4 之前的每个数字创建一个新行,然后退出创建新行:

  @{
            int i = 0;
         }
         @foreach (var item in ViewBag.ProgramIdList)
         {

          if((i / 4) == 0)
          {
              @:<tr>
          }
          <td>
          <input type="checkbox" name="@item.ProgramId" id="@item.ProgramId" />   
         <label for="@item.ProgramTitle">@item.ProgramTitle</label>
         </td>
        if((i / 4) == 0) 
        {
        @:</tr>
          }
             i++;
         }

【问题讨论】:

  • 从逻辑上看你在做什么。 (i / 4) 实际上永远不会等于 0,除非 i == 0。它呈现几行的唯一原因是因为将两个整数相除总是会产生一个整数,而 .NET 必须将该值四舍五入。

标签: c# .net asp.net-mvc-3 razor


【解决方案1】:

使用模运算符。对于:

if((i % 4) == 0)
{
  @:<tr>
}

if((i % 4) == 3)
{
  @:</tr>
}

如果项目数没有分成偶数行,您将在循环后添加剩余的单元格和结束行标记:

if ((i % 4) != 0) {
  while (i % 4) != 0) {
    @:<td></td>
    i++;
  }
  @:</tr>
}

【讨论】:

    【解决方案2】:

    对于那些讨厌上面答案代码出现的语法高亮警告的人,有解决方案(机制大致相同):

    <table>
        @for (int i = 0; i < ViewBag.MyItems.Count; i++)
        {
            var cells = 4;
            var item = ViewBag.MyItems[i];
    
            if ((i % cells) == 0)
            {
                @:<tr>
            }
    
            <td>
                @item.MyTextOrWhatever
            </td>
    
            if (i == (ViewBag.MyItems.Count - 1))
            {
                while ((i % cells) != 0)
                {
                    @:<td></td>
                    i++;
                }
            }
    
            if ((i % cells) == (cells - 1)) // aka: last row cell
            {
                @:</tr>
            }
        }
    </table>
    

    每个标签都在正确的位置(&amp;lt;tr&amp;gt; 中的&lt;td&gt;&lt;table&gt; 中的&amp;lt;tr&amp;gt;),那么您的 Visual Studio 语法荧光笔将使您安心:-)

    【讨论】:

    • 谢谢!为什么它希望使用@: 分隔符将&amp;lt;tr&amp;gt; 标签转义为纯文本?我原以为这会导致它输出&amp;lt;tr&amp;gt;
    • 我认为当你的条件用空单元格填充行时,它会使i 达到cells 的偶数倍。因此,在这种情况下永远不会添加“最后一行单元格”,因为 i%cells = 0,而不是 cells - 1
    • @xr280xr 认为ibase 0 indexcells 表示一行中的单元格总数,例如:i = 0, cells = 4;。第一个单元格,或单元格编号 1,对应于索引 0
    • @xr280xr 也看here 关于@: 语法:..@: 序列表示后面的内容行应该被视为一个内容块..我>
    【解决方案3】:

    100% 有效的确切解决方案。

                @foreach (var item in ViewBag.data)
                {
                    var cells = totalCells;
    
    
                    if ((i % cells) == 0)
                    {
                        @:<tr>
                    }
                    <td>
                        @item.Value
                    </td>
    
    
    
                    if ((i % cells) == (cells - 1)) // aka: last row cell
                    {
                    @:</tr>
    
                    }
                    i++;
                }
    

    【讨论】:

      猜你喜欢
      • 2018-06-09
      • 1970-01-01
      • 2016-08-03
      • 1970-01-01
      • 2011-03-09
      • 1970-01-01
      • 2021-01-02
      • 2019-03-03
      • 1970-01-01
      相关资源
      最近更新 更多