ASP.NET MVC利用PagedList分页(一)

来源:互联网 发布:每天编程一小时网站 编辑:程序博客网 时间:2024/05/29 12:11

前几天看见博客园上有人写ASP.NET MVC的分页思想,这让我不禁想起了PagedList。PagedList是NuGet上提供的一个分页的类库,能对任何IEnumerable<T>进行分页,而且非常简单好用。从NuGet上,可以获取两个DLL:PagedList.dll和PagedList.Mvc.dll。PagedList.dll提供分页的核心操作,PagedList.Mvc.dll是一个辅助类库,在创建分页的UI时候提供简单、可扩展的创建方法。不过PagedList.dll可以用于MVC2及其以上,但是PagedList .Mvc.dll只能用于MVC3(及其以上)。

使用PagedList:

(一)、安装PagedList:引用-->Add Library Package Reference--->OnLine All--->搜索PagedList,点击Install安装。(如果没有安装Nuget,可以到下面地址下载:http://www.nuget.org/)

(二)、NuGet的好处就是我们不用再进行web.config等各种复杂的配置,所以下面直接编码:

using PagedList;
.....
//Controller:PersonController
public ViewResult Index(int? page)
{
int pageNumber = page ?? 1;
int pageSize = 2;
var persons = db.Persons.ToList();
return View(persons.ToPagedList(pageNumber, pageSize));
}
......
//View:Views/Person/Index
@model PagedList.PagedList<XXX.Person>......
<div>
Page @(Model.PageCount 
< Model.PageNumber ? 0 : Model.PageNumber)
of @Model.PageCount

@if (Model.HasPreviousPage)
{
@Html.ActionLink(
"<<""Index"new { Page = 1 })
@Html.Raw(
" ")
@Html.ActionLink(
"< Prve""Index"new { Page = Model.PageNumber - 1 })
}
else
{
@:
<<
@Html.Raw(
" ")
@:
< Prev
}
@Html.Raw(
" ")
@if (Model.HasNextPage)
{
@Html.ActionLink(
"Next >""Index"new { Page = Model.PageNumber + 1 })
@Html.Raw(
" ")
@Html.ActionLink(
">>""Index"new { Page = Model.PageCount })
}
else
{
@:Next
>
@Html.Raw(
" ")
@:
>>
}
</div>

 是不是很简单一句简单的ToPageList就会返回一个强类型的PagedList.PagedList<T>对象,而且PagedList.PagedList<T>实现了IPagedList接口,通过对象浏览器我们可以看到IPagedList提供了很多方法和属性供我们在View绑定时候使用(例如HasPreviousPage、HasNextPage、PageCount、PageNumer等等),如下图:

 不过还有两个问题:

第一、看了Controller中的代码,第一感觉是糟了。db.Persons.ToList() 太危险了,ToList时候数据已经执行,幻想一下,如果是百万甚至千万级的数据。。。所以这样不行。因为这里没有起到分页的效果。解决思路,赶紧组织其执行。

第二、View中绑定分页还有没有更好的方法,每次这样写是不是太费劲了呢?答案是肯定的,PagedList.Mvc.dll提供了分页导航功能。

利用PagedList优化分页:

//Controller: PersonController
public ViewResult Index(int? page)
{
int pageNumber = page ?? 1;
int pageSize = 2;
//Skip之前必须orderby
var persons = from p<span bdsharebuttonbox"="" style="margin: 0px; padding: 0px;">

0 0