服务器端分页 MVC 6.0

Server-Side Paging MVC 6.0

我有带 WCF 服务的 MVC 项目。

当我显示数据列表时,我确实想从 database/service 加载所有内容并进行客户端分页。但我确实想要服务器端分页。如果我有 100 条记录,页面大小为 10,那么当用户点击第 1 页时,它只会从数据库中检索前 10 条记录,如果用户点击第 3 页,那么它只会检索相应的 10 条记录. 我没有使用 Angular 或任何其他 bootstrap。

有人可以指导我怎么做吗?

  public ActionResult Index(int pageNo = 1)
    {
        ..
        ..
        ..      

        MyViewModel[] myViewModelListArray = MyService.GetData();           

        //when I create this PageList, BLL.GetData have to retreive all the records  to show more than a single page no. 
        //But if the BLL.GetData() was changed to retrieve a subset, then it only shows a single page no.
        //what I wanted to do is, show the correct no of pages (if there are 50 records, and pageSize is 10, then show 
        //page 1,2,3,4,5 and only retrieve 10 records at a time.
        PagedList<MyViewModel> pageList = new PagedList<<MyViewModel>(myViewModelListArray, pageNo, pageSizeListing);
        ..
        ..
        ..
        return View(pageList);
    }

最好的方法是使用 LINQ to Entities 运算符 Skip & Take。

例如,转到页面

int items_per_page = 10;
MyViewModel[] myViewModelListArray = MyService.GetData().OrderBy(p => p.ID).Skip((pageNo - 1) * items_per_page).Take(items_per_page).ToArray();

注意:数据必须排序,所以页面有一定的一致性(但我是按任意字段 ID 做的)。此外,一些数据库需要 'order by' 才能应用 'limit' 或 'top'(这就是 Take/Skip 的实现方式)。

我这么说,因为我不知道你是如何检索数据的。 但是,与其使用 GetData 检索完整列表然后过滤掉,不如在 GetData 内的查询中包含分页(这样您就不会检索到不必要的数据)。

将参数页面大小和页码添加到您的服务方法,并使结果成为一个对象,其中 returns TotalCount 和一个列表项目(项目是当前页面上的项目)。然后您可以使用这些值来创建 PagedList。

在您的业务逻辑代码中,您将执行两个查询,一个用于项目计数,一个用于页面上的项目。

此外,如果您现在开始该项目,请帮自己一个忙,从您的体系结构中删除无用的 WCF 服务。