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