72

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>

}

我想我可以创建一个 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>

不确定我今天是否有一个金发碧眼的日子,这非常容易,但我想不出传递 int 值的最佳方法。希望有人能提供帮助。

4

11 回答 11

163
 @{int i = 0;}
 @foreach(var myItem in Model.Members)
 {
     <span>@i</span>
     @{i++;
      }
 }

// 使用@{i++ 增加值}

于 2014-03-13T08:40:22.830 回答
85
//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>
}

有关我的博客文章 http://jimfrenette.com/2012/11/razor-foreach-loop-with-index/的更多信息

于 2012-11-29T22:44:00.033 回答
11

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

@foreach(var myItem in Model.Members)
{    
    <span>@Model.Members.IndexOf(myItem)</span>
}
于 2016-11-17T00:55:35.100 回答
7

看看这个使用 Linq 的解决方案。他的示例与他的示例相似,因为他需要为每个第 3 个项目使用不同的标记。

foreach( var myItem in Model.Members.Select(x,i) => new {Member = x, Index = i){
    ...
}
于 2012-04-26T02:43:54.143 回答
3

您是否有理由不使用 CSS 选择器来设置第一个和最后一个元素的样式,而不是尝试将自定义类附加到它们?不要使用基于 alpha 或 omega 的样式,而是使用 first-child 和 last-child。

http://www.quirksmode.org/css/firstchild.html

于 2012-04-26T02:53:21.860 回答
2

IndexOf 在这里似乎很有用。

@foreach (myItemClass ts in Model.ItemList.Where(x => x.Type == "something"))
    {
       int currentIndex = Model.ItemList.IndexOf(ts);
       @Html.HiddenFor(x=>Model.ItemList[currentIndex].Type)

...

于 2015-08-13T11:10:32.663 回答
1

您还可以使用解构和元组并尝试这样的事情:

@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>
  }
}

有关更多信息,您可以查看此链接

于 2020-05-06T10:06:49.173 回答
0

非常简单:

     @{
         int i = 0;
         foreach (var item in Model)
         {
          <tr>
          <td>@(i = i + 1)</td>`
          </tr>
         }
      }`
于 2017-07-16T03:56:09.583 回答
0

以上所有答案都需要视图中的逻辑。视图应该是愚蠢的并且包含尽可能少的逻辑。为什么不在视图模型中创建与列表中位置相对应的属性,例如:

public int Position {get; set}

在您的视图模型构建器中,您设置位置 1 到 4。

但是..甚至还有更清洁的方法。为什么不让 CSS 类成为你的视图模型的属性呢?因此,您只需执行以下操作,而不是部分中的 switch 语句:

<div class="@Model.GridCSS">

将 switch 语句移动到您的视图模型构建器并在那里填充 CSS 类。

于 2018-09-07T17:22:22.460 回答
0

如果您想在您的视图的 foreach 循环中计算来自模型的引用(即:客户端将地址作为引用,因此您想计算客户端将存在多少地址),例如:

 @foreach (var item in Model)
                        {
                            <tr>
                                <td>
                                    @Html.DisplayFor(modelItem => item.DtCadastro)
                                </td>

                                <td style="width:50%">
                                    @Html.DisplayFor(modelItem => item.DsLembrete)
                                </td>
                                <td>
                                    @Html.DisplayFor(modelItem => item.DtLembrete)
                                </td>
                                <td>
                                    @{ 
                                        var contador = item.LembreteEnvolvido.Where(w => w.IdLembrete == item.IdLembrete).Count();
                                    }
                                    <button class="btn-link associado" data-id="@item.IdLembrete" data-path="/LembreteEnvolvido/Index/@item.IdLembrete"><i class="fas fa-search"></i> @contador</button>
                                    <button class="btn-link associar" data-id="@item.IdLembrete" data-path="/LembreteEnvolvido/Create/@item.IdLembrete"><i class="fas fa-plus"></i></button>
                                </td>
                                <td class="text-right">
                                    <button class="btn-link delete" data-id="@item.IdLembrete" data-path="/Lembretes/Delete/@item.IdLembrete">Excluir</button>
                                </td>
                            </tr>
                        }

按照编码执行:

@{ var contador = item.LembreteEnvolvido.Where(w => w.IdLembrete == item.IdLembrete).Count();}

并像这样使用它:

<button class="btn-link associado" data-id="@item.IdLembrete" data-path="/LembreteEnvolvido/Index/@item.IdLembrete"><i class="fas fa-search"></i> @contador</button>

ps:不要忘记在你的 DbContext 里面添加 INCLUDE 到那个引用,例如,你的 Index 动作控制器,以防这是一个 IEnumerable 模型。

于 2018-11-26T04:35:52.470 回答
0

我更喜欢使用这种扩展方法:

public static class Extensions
{
    public static IEnumerable<(T item, int index)> WithIndex<T>(this IEnumerable<T> self)
        => self.Select((item, index) => (item, index));
}

来源:

https://stackoverflow.com/a/39997157/3850405

剃刀:

@using Project.Shared.Helpers 

@foreach (var (item, index) in collection.WithIndex())
{
<p>
    Name: @item.Name Index: @index
</p>
}
于 2021-02-20T16:56:10.140 回答