前一段时间我根据书中的内容,写了一篇入门级的ASP.NET MVC 分页制作博客《ASP.NET MVC:排序、搜索、分页以及多对多数据库》,里面就有描述到通过PagedLive对数据进行分页,但里面的代码只可以在小网站中应用,在项目实际应用的时候,如果数据库过大的时候,这种完全没有优化过的代码会使网站反应过慢。
在这篇文章里面会继续使用PagedLive这个工具,内容包括:对ASP.NET MVC的路由设置,使用PagedLive中的StaticPagedList,PagedLive一些自定义模板,这些都是我在实际的项目中应用到的,代码进行简化、加工、提纯,但保证一定可以运行。(如何安装PagedLive请参考文章:ASP.NET MVC:排序、搜索、分页以及多对多数据库)
首先来说明一下,假设我这个项目是用在一个News数据库的List页面,控制器取名为NewsController,页面是默认的Index,那么需要做如下设置:
1.打开App_Start文件夹,点击RouteConfig.cs,增加以下代码:
routes.MapRoute(
name: "Default2",
url: "News/Index/{page}",
defaults: new { controller = "News", action = "Index", page = 1 }
);
如果不做路由设置,那么该页面的网站是:http://www.xxx.com/News?page=2 或者是 http://www.xxx.com/News/Index?page=2 (根据系统路由的默认设置,这两者都是可以的)。
设置路由以后,运行页面,http://www.xxx.com/News/Index/2(News控制器如果没有其它页面,甚至可以把Index也给去掉。)
2.打开控制器NewsController,修改Index
using PagedList;
....
public ActionResult Index(int? page)
{
int pageSize = 10;
int pageIndex = page ?? 1;
int totalCount = 0;
var newslist = GetNews(pageIndex, pageSize, ref totalCount);
var NEWSlistpage = new StaticPagedList(newslist, pageIndex, pageSize, totalCount);
return View(NEWSlistpage);
}
public List GetNews(int pageIndex,int pageSize,ref int totalCount)
{
var newslist = (from p in db.News orderby p.NewsID descending select p).Skip((pageIndex - 1) * pageSize).Take(pageSize);
totalCount = db.News.Count();
return newslist.ToList();
}
从代码中,我们可以看出,我们首先提取出每一页需要的数据,采用Skip和Take进行数据提取,再进行ToList,最后把数据注入到StaticPagedList
3.视图的必要代码如下:
@using PagedList;
@using PagedList.Mvc;
@model PagedList.StaticPagedList
......
@section AddToHead{
}
.....
@foreach (var item in Model)
{
@Html.DisplayFor(modelItem => item.Title)
@Html.DisplayFor(modelItem => item.Subtitle)
@Html.DisplayFor(modelItem => item.date)
@Html.ActionLink("编辑新闻", "EditNews", new { id = item.NewsID }) |
@Html.ActionLink("删除新闻", "DeleteNews", new { id = item.NewsID })
}
@Html.PagedListPager(Model, page => Url.Action("Index", new { page =page }), new PagedListRenderOptions { LinkToFirstPageFormat = "<< 第一页", LinkToPreviousPageFormat = "< 上一页", LinkToNextPageFormat = "下一页 >", LinkToLastPageFormat = "最末页 >>" })