C# 如何从当前页面中的行子集手动填充页面列表

C# 如何从当前页面中的行子集手动填充页面列表,c#,asp.net,.net,asp.net-mvc,pagination,C#,Asp.net,.net,Asp.net Mvc,Pagination,我自己手动计算了很多行,包括一些数据库中没有的附加数据。为了提高效率,我只根据页码和页面大小计算当前页面中的行 我试着把它放到一个页面列表中,但这需要整个数据集,而不仅仅是我想要显示的子集 请提供仅包含当前页面的自定义分页列表对象的完整示例。可能直接实现IPagedList 另一个问题是,在计算整个列表之前,我可能无法知道行的总数。这真的有必要吗?答案取决于IPagedList的实现。与其他模型一样,PagedList只是一个模型或视图模型。可以通过设置其属性对其进行初始化。此外,分页列表始终只

我自己手动计算了很多行,包括一些数据库中没有的附加数据。为了提高效率,我只根据页码和页面大小计算当前页面中的行

我试着把它放到一个页面列表中,但这需要整个数据集,而不仅仅是我想要显示的子集

请提供仅包含当前页面的自定义分页列表对象的完整示例。可能直接实现IPagedList


另一个问题是,在计算整个列表之前,我可能无法知道行的总数。这真的有必要吗?

答案取决于IPagedList的实现。与其他模型一样,PagedList只是一个模型或视图模型。可以通过设置其属性对其进行初始化。此外,分页列表始终只包含要显示的页面。它永远不会包含整个数据

注意:这个答案中的实现只是为了保持简单。要查看分页列表的流行实现,您可以查看。它包含一些用于自动和手动分页的实现,以及一些用于ASP.NET MVC的有用帮助程序

范例

假设我们有这样的IPagedList实现:


对于此任务,我建议使用现有的NuGet软件包,如下所示:

在这个特定的库中,您可以生成要显示的元素子集,并从该列表中创建StaticPagedList

以下是一个示例:

public class UserController : Controller
{
    public object Index(int? page)
    {
        var pageIndex = (page ?? 1) - 1; //MembershipProvider expects a 0 for the first page
        var pageSize = 10;
        int totalUserCount; // will be set by call to GetAllUsers due to _out_ paramter :-|

        var users = Membership.GetAllUsers(pageIndex, pageSize, out totalUserCount);
        var usersAsIPagedList = new StaticPagedList<MembershipUser>(users, pageIndex + 1, pageSize, totalUserCount);

        ViewBag.OnePageOfUsers = usersAsIPagedList;
        return View();
    }
}

请参见此处的源代码和其他示例:

这取决于IPagedList的实现。在我看来,PagedList和其他模型一样只是一个模型或视图模型。您可以通过设置其属性对其进行初始化。此外,分页列表始终只包含您要显示的页面。它永远不会包含全部数据。最后,我不得不计算出行的总数,以使其正常工作。正如我在中提到的,该库是在下维护的。@RezaAghaei,你说得对。感谢您指出,我已经使用TroyGoode的PagedList有一段时间了,并且有一段时间没有访问项目站点,因此关于它没有被维护的信息已经溜走了。您的答案和@RezaAghaei的答案都满足了我的需要。我只能投票给一个获胜的答案。。。我会选择他的答案,因为他是第一个。你的答案和@Kaspars Ozols的答案都符合我的需要。我会选择你的,因为你是第一个。谢谢你的反馈:正如在这个答案的答案实现中提到的,只是为了让事情简单。要查看分页列表的流行实现,您可以查看。
using System;
using System.Collections.Generic;
using System.Linq;
public static class PagingExtensions
{
    public static PagedList<T> ToPagedList<T>(this IEnumerable<T> source, 
        int pageNumber, int pageSize) where T : class
    { return source.AsQueryable().ToPagedList(pageNumber, pageSize); }
    public static PagedList<T> ToPagedList<T>(this IQueryable<T> source, 
        int pageNumber, int pageSize) where T : class
    { return CreatePagesList<T>(source, pageNumber, pageSize); }
    private static PagedList<T> CreatePagesList<T>(IQueryable<T> source, 
        int pageNumber, int pageSize) where T : class
    {
        var items = new List<T>();
        var pageIndex = pageNumber - 1;
        if (source == null) source = new List<T>().AsQueryable();
        var totalItemsCount = source.Count();
        if (pageNumber < 1)
            throw new ArgumentOutOfRangeException("pageNumber cannot be less than 1.");
        if (pageSize < 1)
            throw new ArgumentOutOfRangeException("pageSize cannot be less than 1.");
        var pageCount = 0;
        if (totalItemsCount > 0)
            pageCount = (int)Math.Ceiling(totalItemsCount / (double)pageSize);
        if (pageIndex >= pageCount)
            pageIndex = Math.Max(pageCount - 1, 0);
        if (pageIndex < pageCount && totalItemsCount > 0)
            items.AddRange(source.Skip((pageIndex) * pageSize).Take(pageSize).ToList());
        var pagedList=  new PagedList<T>()
        {
            PageNumber = pageNumber, PageSize = pageSize,
            PageCount = pageCount, TotalItemsCount = totalItemsCount
        };
        pagedList.AddRange(items);
        return pagedList;
    }
}
public class UserController : Controller
{
    public object Index(int? page)
    {
        var pageIndex = (page ?? 1) - 1; //MembershipProvider expects a 0 for the first page
        var pageSize = 10;
        int totalUserCount; // will be set by call to GetAllUsers due to _out_ paramter :-|

        var users = Membership.GetAllUsers(pageIndex, pageSize, out totalUserCount);
        var usersAsIPagedList = new StaticPagedList<MembershipUser>(users, pageIndex + 1, pageSize, totalUserCount);

        ViewBag.OnePageOfUsers = usersAsIPagedList;
        return View();
    }
}