引言
分页这个名词对于现在的我们来说已经非常的熟悉,因为我知道了为什么我会在显示数
据的时候采用分页的形式,有人说为了显示的美观,有的人说为了在众多的数据中能容
易的找到我们想要的数据等等,这些都是其中的一些原因,但是这些东西我们完全可以
用VS自带的控件来实现,也就是所以的假分页,那么假分页和真分页的本质是什么呢?
假分页是一次性把所要的数据全部在数据库中查询出来,只是在显示的时候分页显示罢
了,这样显然是非常影响性能的,而真分页是每次取每页的数据条数,这样在大数据的
时候就能体现出了它的优势。下面来看如何用MVC+EF快速实现分页。
效果展示:
一、实现分页的核心代码
我在Model层封装了一个属于自己的HtmlHelper类,里面就承载了我的这部分代码:
public static HtmlString ShowPageNavigate(this HtmlHelper htmlHelper, int currentPage, int pageSize, int totalCount)
{
var redirectTo = htmlHelper.ViewContext.RequestContext.HttpContext.Request.Url.AbsolutePath;
pageSize = pageSize == 0 ? 3 : pageSize;
var totalPages = Math.Max((totalCount + pageSize - 1) / pageSize, 1);//总页数
var output = new StringBuilder();
if (totalPages > 1)
{
//if (currentPage!=1)
{//处理首页连接
output.AppendFormat("<a class='pageLink' href='{0}?pageIndex=1&pageSize={1}'>首页</a>", redirectTo, pageSize);
}
if (currentPage > 1)
{//处理上一页的连接
output.AppendFormat("<a class='pageLink' href='{0}?pageIndex=1&pageSize={1}&pageSize={2}'>上一页</a>", redirectTo, currentPage - 1, pageSize);
}
else
{
//output.Append("<span class='pageLink'>上一页</span>");
}
output.Append(" ");
int currint = 5;
for (int i = 0; i < 10; i++)
{//一共最多系那是10个页码,前面5个后面5个
if ((currentPage + i -currint) >= 1 && (currentPage + i - currint)<=totalPages)
{
if (currint==i)
{//当前页处理
output.AppendFormat("<a class='cpb' href='{0}?pageIndex={1} & pageSize={2}'>{3}</a>",redirectTo,currentPage,pageSize,currentPage);
}
else
{//一般页处理
output.AppendFormat("<a class='cpb' href='{0}?pageIndex={1} & pageSize={2}'>{3}</a>", redirectTo, currentPage + i - currint, pageSize, currentPage + i - currint);
}
}
output.Append(" ");
}
if (currentPage < totalPages)
{//处理下一页的连接
output.AppendFormat("<a class='pageLink' href='{0}?pageIndex={1} & pageSize={2}'>下一页</a>", redirectTo, currentPage + 1, pageSize);
}
else
{
}
output.Append(" ");
if (currentPage!=totalPages)
{
output.AppendFormat("<a class='pageLink' href='{0}?pageIndex={1} & pageSize={2}'>末页</a>", redirectTo, totalPages, pageSize);
}
output.Append(" ");
}
output.AppendFormat("第{0}页 / 共{1}页", currentPage, totalPages);//这个统计加不加都行
return new HtmlString(output.ToString());
}
二、分页显示的样式代码
<style type ="text/css">
.paginator {
font:12px Arial,Helvetica,sans-serif;
padding:10px 20px 10px 0;
margin:0px;
}
.paginator a {
border:solid 1px #ccc;
color:#0063dc;
cursor:pointer;
text-decoration:none;
}
.paginator a:visited {
padding:1px 6px;
border:solid 1px #ddd;
background:#fff;
text-decoration:none;
}
.paginator .cpb {
border:1px solid #F50;
font-weight:700;
color:#F50;
background-color:#ffeee5;
}
.paginator a:hover {
border:solid 1px #F50;
color:#f60;
text-decoration:none;
}
.paginator a, .paginator a:visited, .paginator .cpb, .paginator a:hover {
float:left;
height:16px;
line-height:16px;
min-width:10px;
_width:10px;
margin-right:5px;
text-align:center;
white-space:nowrap;
font-size:12px;
font-family:Arialm,SimSun;
padding:0 3px;
}
</style>
三、View层代码
<div class ="paginator">
<%:Html.ShowPageNavigate((int)ViewBag.CurrentPage,(int)ViewBag.PageSize,(int)ViewBag.Total) %>
</div>
四、控制器代码
public ActionResult Index()
{
ViewData.Model = db.Province.AsEnumerable();
int pageIndex=Request["pageIndex"] == null ? 1 : int.Parse(Request["pageIndex"]);
ViewBag.CurrentPage =pageIndex;
int pageSize=Request["pageSize"] == null ? 5: int.Parse(Request["pageSize"]);
ViewBag.PageSize = pageSize;
ViewBag.Total = db.Province.Count();
ViewData.Model = db.Province.OrderBy(c => c.provinceID).Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();
return View();
}
小结
当我在做机房的时候第一次接触到SqlHelper的时候,发现这个东西太好用了,直接给
我们省了很多的代码,,当时是比较高兴的(相对我们第一遍机房的时候),然后在图
书馆项目中第一次接触到EF实体架构的时候,利用EF+Linq实现D层的操作实在是太无
压力了,当时有点震惊的感觉。当接触了MVC+EF的时候,我发现我高兴早了,利用这
个技术想实现个对实体的增、删、改、查那就是分分钟钟的事情,现在的编码实在是让
我们有一种飞的感觉,其实越是这样我们的基础知识越重要,因为这些封装的非常全的
东西,我们只有有了很好的基础知识之后,才能更好的驾驭这些东西,所以在B/S的学
习过程中一定要加强基础知识的学习!!!