服务器端分页 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 服务。
我有带 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 服务。