如何从当前页中的行子集手动填充PagedList
本文关键字:子集 填充 PagedList 当前页 | 更新日期: 2023-09-27 18:17:27
我自己手动计算了一堆行,包括一些附加数据,这些数据不在我的数据库中。为了提高效率,我只根据页码和页面大小计算当前页面中的行。
我试图将其推入PagedList
,但这需要整个数据集,而不是只是我想显示的子集。
请提供仅包含当前页的自定义分页列表对象的完整示例。也许直接实施IPagedList
??
另一个问题是,在计算整个列表之前,我可能无法知道总行数。这真的有必要吗?
对于这个任务,我建议使用现有的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;
}
}