首页 > 解决方案 > 如何在视图中使用 ASP.NET Core 在 @foreach 循环中获取迭代数

问题描述

我是 ASP.NET Core 开发的新手。我正在寻找一种在 ASP.NET Core 视图中使用循环迭代数的内置方法。

我做了一些研究并找到了解决方案,比如在循环外创建 int 变量,然后在循环内递增。

我想索引每个用户。

这是我的代码:

@foreach (var item in l_IEnumerableModUserQuery)
{
    <tr>
        <td> 
            <!-- Here I want to add Iteration No. here--> 
        </td>
        <td>
            <a href="#">
                @item.Pr_FullName
            </a>
        </td>
        <td>@item.Pr_Email</td>
        <td>@item.Pr_ContactNo</td>
    </tr>
}

标签: asp.netasp.net-core

解决方案


您可以使用简单的 for 循环来获取索引:

//use .Count if it is a List or .Count() with Linq to get the boundary.
@for(var i = 0; i < l_IEnumerableModUserQuery.Count; i++)
{
    <tr>
        <td> 
            @i.ToString();
        </td>
        <td>
            <a href="#">
                @l_IEnumerableModUserQuery[i].Pr_FullName
            </a>
        </td>
        <td>@l_IEnumerableModUserQuery[i].Pr_Email</td>
        <td>@l_IEnumerableModUserQuery[i].Pr_ContactNo</td>
    </tr>
}

Thomas Levesque 在他的博客上有一个简洁的方法,使用扩展方法:

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

这将导致:

@foreach (var (item, idx) in l_IEnumerableModUserQuery.WithIndex())
{
    <tr>
        <td> 
            @idx
        </td>
        <td>
            <a href="#">
                @item.Pr_FullName
            </a>
        </td>
        <td>@item.Pr_Email</td>
        <td>@item.Pr_ContactNo</td>
    </tr>
}

着眼于扩展方法方法,您也可以修改您的视图模型并将索引作为属性包含在您的控制器/处理程序内的模型中或创建模型的任何位置:

var l_IEnumerableModUserQuery = 
     someSource.Where(x => ...)
               .Select((x, index) => new MyModel {
                     Index = index,
                     Pr_Email = xxx,
                     Pr_Contact = xxy,
                     /* ... rest of model */
               });
return l_IEnumerableModUserQuery;

在此之后,您可以像访问视图中的任何其他属性一样访问索引:

 <a href="#">
       @item.Index
 </a>

推荐阅读