我正在使用PagedList
在我的搜索结果页面上显示分页。我想在每页上只显示5笔付款。我正在测试的搜索条件返回15条记录。我期待第一页只有5条记录,底部有1,2,3页。我在底部看到了预期的页码,但每页都显示了所有15条记录。我调试了代码,发现StaticPagedList
函数返回15条记录而不是5条。我的控制器动作代码如下:
public ViewResult ViewPayment(int? billerId, int? billAccount, int? page)
{
var pageIndex = (page ?? 1) - 1;
var pageSize = 5;
List<Payment> paymentList = new List<Payment>();
paymentList = _paymentBusiness.GetPayments(billerId, billAccount);
var paymentsAsIPagedList = new StaticPagedList<Payment>(paymentList, pageIndex + 1, pageSize, paymentList.Count);
ViewBag.OnePageOfPayments = paymentsAsIPagedList;
return View(paymentList);
}
如果我弄错了,请告诉我。
答案 0 :(得分:2)
您应该只查询业务层中的5条记录。现在你没有传递页码或任何东西。如果你打算只展示其中的一些,那么查询所有这些都是一种浪费。
public ViewResult ViewPayment(int? billerId, int? billAccount, int? page)
{
int pageNum = page ?? 1;
int pageSize = 5;
IPagedList<Payment> paymentPage = _paymentBusiness.GetPayments(billerId, billAccount, page, pageSize);
return View(paymentPage);
}
// Business layer
public IPagedList<Payment> GetPayments(int? billerId, int? billAccount, int page, int pageSize)
{
IQueryable<Payment> payments = db.Payments.Where(p => ....).OrderBy(p => ...);
return new PagedList<Payment>(payments, page, pageSize);
}
我建议你做一些类似上面的事情。更改它,以便业务/数据层为您提供分页列表。它可以获得5个结果,以及带有两个查询的总计数,并返回控制器的页面模型。
该示例使用PagedList<T>
获取一个页面,该页面在内部运行Skip()和Take()。请务必在创建页面之前订购结果。
重要的是,现在我们不从数据库中获取所有项目,只获取我们感兴趣的小子集。
如果您正在使用例如要求您使用纯SQL的ADO.NET,您可以使用如下查询:
SELECT * FROM Payments ORDER BY id OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY;
偏移量应设置为(page - 1) * pageSize
,FETCH NEXT之后的数字是页面大小。请注意,这仅适用于SQL Server 2012+。其他数据库具有相似的能力。
此外,使用ADO.NET,您必须手动进行两个查询(页面+总计数),并使用StaticPagedList
代替PagedList
,这样您就可以直接为其提供子集
答案 1 :(得分:0)
使用PagedList(不提供异步方法)的另一种方法是使用DataTables.net(https://datatables.net)。
它是用于分页表的客户端javascript框架,可以配置为非常低的级别。这将允许您执行所需的操作,并且还可以自定义排序,缓存,搜索以及许多其他功能。
只是一个建议,因为我过去自己使用过PagedList库,自从发现DataTables.Net以来,我没有回头。伟大的图书馆,让您的生活轻松。