ASP.Net MVC PagedList无法正常工作

时间:2017-01-29 18:05:03

标签: asp.net-mvc pagedlist

我正在使用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);
}

如果我弄错了,请告诉我。

2 个答案:

答案 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以来,我没有回头。伟大的图书馆,让您的生活轻松。