2016-11-03 70 views
2

我有使用WCF服务的MVC项目。服务器端分页MVC 6.0

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

有人可以指导我如何做到这一点?

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); 
    } 
+0

你可以发布一些代码告诉我们你试过了什么,并且不工作吗?要向大家展示您正在使用的是什么类型的环境以及您正在使用的编码风格,这将有很长的路要走。 –

+0

请显示一些代码。您也可以尝试将启动和限制传递给服务器,以便告诉服务器应该返回哪些特定记录集。 – bogzy

+1

@bogzy如果我通过传递PageSize和PageNo来限制要返回的特定记录集,那么它只显示一个页面。 – user423415

回答

1

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

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

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

+0

我为PaedList中的TotalCount设置了哪些属性? – user423415

+0

您不使用PagedList。如果你想使用渲染功能(html助手方法),你可以在你自己的类中实现这个接口 - https://github.com/troygoode/PagedList/blob/master/src/PagedList/IPagedList.cs – Stilgar

2

最好的方法是使用LINQ to Entities运算符跳过&拿。

例如,页面

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中的查询中包含分页(因此您不必检索不必要的数据)。