答案取决于IPagedList 的实现。 PagedList 只是一个模型(或视图模型),就像其他模型一样。您可以通过设置其属性来初始化它。分页列表也总是只包含您要显示的页面。它永远不会包含全部数据。
注意:此答案中的实现只是为了保持简单。要查看分页列表的流行实现,您可以查看X.PagedList。它包含一些自动和手动分页的实现以及一些对 ASP.NET 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;
}
}