获取razor foreach的索引值

llo*_*ips 52 asp.net-mvc partial-views razor asp.net-mvc-2

List<T>在我的视图中在一个剃刀foreach循环中迭代一个部分.在部分我正在渲染一个我希望在我的视图中连续4行的记录.我有两个结束列的css类,因此需要在部分中确定调用是第一个还是第四个记录.在我的部分中输出正确代码的最佳方法是什么?

这是我的主页面,其中包含循环:

@foreach (var myItem in Model.Members){

        //if i = 1
        <div class="grid_20">
        <!-- Start Row -->

        //is there someway to get in for i = 1 to 4 and pass to partial?
        @Html.Partial("nameOfPartial", Model)

        //if i = 4 then output below and reset i to 1
        <div class="clear"></div>
        <!-- End Row -->
        </div>

}
Run Code Online (Sandbox Code Playgroud)

我想我可以创建一个int,我可以在每次传递时更新并在这里渲染文本没有问题,但它将整数值传递给我更偏心的部分.除非有更好的方法.

这是我的部分:

@{
switch()
case 1:
        <text>
        <div class="grid_4 alpha">
        </text>
break;
case 4:
        <text>
        <div class="grid_4 omega">
        </text>
break;
default:
        <text>
        <div class="grid_4">
        </text>
break;
}

        <img src="Content/960-grid/spacer.gif" style="width:130px; height:160px; background-color:#fff; border:10px solid #d3d3d3;" />
        <p><a href="member-card.html">@Model.Name</a><br/>
        @Model.Job<br/>
        @Model.Location</p>
</div>
Run Code Online (Sandbox Code Playgroud)

不确定我今天是否有一个金发碧眼的日子,这很容易,但我想不出最好的方法来传递int值.希望有人可以提供帮助.

noa*_*hen 134

 @{int i = 0;}
 @foreach(var myItem in Model.Members)
 {
     <span>@i</span>
     @{i++;
      }
 }
Run Code Online (Sandbox Code Playgroud)

  • @(i++) 更紧凑 :) (3认同)
  • @(i++) 将显示为文本。上面的代码中,这样会更好,但是如果不需要显示的话,应该是i++; (2认同)
  • 这个答案的问题是,如果页面上有多个 foreach 循环,则必须为每个循环声明一个新变量,而不是每次都使用 i 。 (2认同)

小智 68

//this gets you both the item (myItem.value) and its index (myItem.i)
@foreach (var myItem in Model.Members.Select((value,i) => new {i, value}))
{
    <li>The index is @myItem.i and a value is @myItem.value.Name</li>
}
Run Code Online (Sandbox Code Playgroud)

更多信息,请访问我的博客 http://jimfrenette.com/2012/11/razor-foreach-loop-with-index/

  • 感谢使用LINQ. (4认同)

小智 8

使用Linq查看此解决方案.他的例子类似,因为他需要为每第3个项目提供不同的标记.

foreach( var myItem in Model.Members.Select(x,i) => new {Member = x, Index = i){
    ...
}
Run Code Online (Sandbox Code Playgroud)


Man*_*Mel 8

或者你可以简单地这样做:

@foreach(var myItem in Model.Members)
{    
    <span>@Model.Members.IndexOf(myItem)</span>
}
Run Code Online (Sandbox Code Playgroud)

  • 可怕的答案.如果您在列表中有欺骗行为,则无效.非常慢,因为它在每次迭代时搜索列表.一切都很糟糕. (3认同)

ppo*_*zos 7

您还可以使用解构和元组并尝试如下操作:

@foreach (var (index, member) in @Model.Members.Select((member, i) => (i, member)))
{
  <div>@index - @member.anyProperty</div>

  if(index > 0 && index % 4 == 0) { // display clear div every 4 elements
      @: <div class="clear"></div>
  }
}
Run Code Online (Sandbox Code Playgroud)

欲了解更多信息,您可以查看此链接