ASP.Net MVC PagedList 无法正常工作
ASP.Net MVC PagedList not working properly
我正在使用 PagedList
在我的搜索支付结果页面上显示分页。我只想在每个页面上显示 5 笔付款。我正在测试的搜索条件 returns 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);
}
如有错误请告知。
您应该只从您的业务层查询 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);
}
我建议你做类似上面的事情。更改它以便 business/data 层返回分页列表。它可以获得 5 个结果,以及两个查询的总计数,以及 return 你的控制器页面模型。
该示例使用 PagedList<T>
获取页面,该页面在内部运行 Skip() 和 Take()。请记住在创建页面之前订购您的结果。
重要的是,现在我们不从数据库中获取所有项目,只获取我们感兴趣的一小部分。
如果您正在使用例如ADO.NET 要求您使用纯 SQL,您可以使用如下查询:
SELECT * FROM Payments ORDER BY id OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY;
Offset 应设置为(page - 1) * pageSize
,FETCH NEXT 后面的数字是页面大小。请注意,这仅适用于 SQL Server 2012+。其他数据库也有类似的能力。
此外,对于 ADO.NET,您必须手动进行两个查询(页数 + 总计数),并使用 StaticPagedList
而不是 PagedList
,这样您就可以给出它直接是子集。
另一种使用 PagedList(不提供异步方法)的方法是使用 DataTables.net (https://datatables.net).
它是用于分页表的客户端 javascript 框架,可以配置到非常低的级别。这将允许您做您需要的事情,并且还具有自定义排序、缓存、搜索和许多开箱即用的其他功能的能力。
只是一个建议,因为我自己过去使用过 PagedList 库,并且自从发现 DataTables.Net 后,我就没有回头。很棒的图书馆,让您的生活更轻松。
我正在使用 PagedList
在我的搜索支付结果页面上显示分页。我只想在每个页面上显示 5 笔付款。我正在测试的搜索条件 returns 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);
}
如有错误请告知。
您应该只从您的业务层查询 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);
}
我建议你做类似上面的事情。更改它以便 business/data 层返回分页列表。它可以获得 5 个结果,以及两个查询的总计数,以及 return 你的控制器页面模型。
该示例使用 PagedList<T>
获取页面,该页面在内部运行 Skip() 和 Take()。请记住在创建页面之前订购您的结果。
重要的是,现在我们不从数据库中获取所有项目,只获取我们感兴趣的一小部分。
如果您正在使用例如ADO.NET 要求您使用纯 SQL,您可以使用如下查询:
SELECT * FROM Payments ORDER BY id OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY;
Offset 应设置为(page - 1) * pageSize
,FETCH NEXT 后面的数字是页面大小。请注意,这仅适用于 SQL Server 2012+。其他数据库也有类似的能力。
此外,对于 ADO.NET,您必须手动进行两个查询(页数 + 总计数),并使用 StaticPagedList
而不是 PagedList
,这样您就可以给出它直接是子集。
另一种使用 PagedList(不提供异步方法)的方法是使用 DataTables.net (https://datatables.net).
它是用于分页表的客户端 javascript 框架,可以配置到非常低的级别。这将允许您做您需要的事情,并且还具有自定义排序、缓存、搜索和许多开箱即用的其他功能的能力。
只是一个建议,因为我自己过去使用过 PagedList 库,并且自从发现 DataTables.Net 后,我就没有回头。很棒的图书馆,让您的生活更轻松。