如何从当前页中的行子集手动填充PagedList

本文关键字:子集 填充 PagedList 当前页 | 更新日期: 2023-09-27 18:17:27

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

我试图将其推入PagedList,但这需要整个数据集,而不是只是我想显示的子集。

请提供仅包含当前页的自定义分页列表对象的完整示例。也许直接实施IPagedList ??

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

如何从当前页中的行子集手动填充PagedList

对于这个任务,我建议使用现有的NuGet包,如下所示:https://www.nuget.org/packages/PagedList

在这个特定的库中,您可以生成您想要显示的元素子集,并从该列表中创建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();
    }
}

见源代码&其他示例:https://github.com/TroyGoode/PagedList

答案取决于IPagedList的实现。PagedList与其他模型一样只是一个模型(或视图模型)。你可以通过设置它的属性来初始化它。此外,页面列表总是只包含您想要显示的页面。它永远不会包含全部数据。

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

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

public interface IPagedList<T> : IList<T>
{
    int PageCount { get; set; }
    int PageSize { get; set; }
    int PageNumber { get; set; }
    int TotalItemsCount { get; set; }
}
public class PagedList<T> : List<T>, IPagedList<T>
    where T : class
{
    public int PageCount { get; set; }
    public int PageSize { get; set; }
    public int PageNumber { get; set; }
    public int TotalItemsCount { get; set; }
}

然后你可以像任何其他普通类一样通过分配它的属性来实例化PagedList<T>的实例。

还可以创建一些扩展方法来帮助您提取IQueryable<T>IEnumerable<T>的特定页面的数据:

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