服务器端分页MVC 6.0

本文关键字:MVC 分页 服务器端 | 更新日期: 2023-09-27 18:16:09

我有MVC项目与WCF服务。

当我显示数据列表时,我确实想从数据库/服务加载所有内容并进行客户端分页。但我确实需要服务器端分页。如果我有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);
    }

服务器端分页MVC 6.0

最好的方法是使用LINQ to Entities操作符Skip &。

例如,to page

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内部的查询中包含分页(这样就不会检索不必要的数据)。

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

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

如果你现在开始项目,帮自己一个忙,从你的架构中删除无用的WCF服务。