ASP.NETMVC分页的实现
在ASP.NET中,GridView控件本⾝就带有分页的功能,只要把当前页⾯的索引值赋给GridView的PageIndex就可以实现了分页,⾄于数据怎么分页,全都由GridView封装起来了。
在ASP.NET MVC中分页的实现就只能靠⾃⼰来设计了。⾸先来说⼀下分页的原理。现在有⼀个张news表,中间有很多信息,我们假设⼀页显⽰5条记录,这样,页⾯数量=总记录数/5;这⾥,如果出现⼩数,得进位取整。如⽐总记录和数为51,那么分的页⾯数量是11,最后⼀页只有⼀条记录。好,有这样⼀个思路后,现在就来做ASP.NET MVC中的分页了。
1、数据库和表
创建⼀个Data_Company的数据库,建⼀张news表,表结构如下图:
ID是主键,并助是⾃动增长列。
2、现在,我们⽤O/R Designer来创建news表的LINQ To SQL的实体类。
创建⼀个名为MvcCompany的ASP.NET MVC Web Application项⽬,然后选中Models,右键,“添加”,“新建项”,选中C#中的“数据”,如下图:
选择“LINQ to SQL类”,名称设为“CompanyData.dbml”,然后“添加”。
打开“服务器资源管理器”,创建连接,展开表,到news表,拖到CompanyData.dbml的左边表视图区(注:.dbml视图左边是SQL表和SQL视图区,右边是SQL存储过程和SQL函数区),效果如下图:
在“解决⽅案资源管理器”下的,“Models”多了三个⽂件,CompanyData.dbml,展开它,会有CompanyData.dbml.layout和CompanyData.designer.cs,前者是CompanyData.dbml视图的⼀些信息(⽐如news表在的坐标等信息),后者是news实体类及
Data_Company数据库的类,在数据库类中聚合了news实体类。
3、添加news列表类。因为⼀个news实体类,⼀次只能表⽰⼀条记录,如果呈现⼀个news表中的数据,最好定义⼀个集合类来存临时来存放news记录的集合。
类的实现如下:
Code
这⾥,我们实现了⼀个泛型的集合列表NewList(当然,这⾥的本质上可以当其他实体类的集合列表),在这个类中间,有四个字段,访问修饰符都是public的,分另为:
PageIndex:当前页⾯的索引值
PageSize:每个页⾯的记录的条数
AllCount:记录的总条数
AllPages:共有的页⾯总数
在NewList 构造函数中,有如下代码:
Code
构造函的参数有三个,⼀个是list,就是实体类的⼀个集合,还有就是页⾯索引值和每个页⾯的记录条数。
第1、2代码很容易理⾓,第3⾏代码是得到列表的总记录条数,第4⾏代码,就完成了我们在开始时分析的分页实现的公式:页⾯数量=总记录数/每页记录数,其中Math.Ceiling就是把⼩数部分进到整数的函数。
最关键的是第5⾏代码,⾸先看Skip(PageIndex*PageSize),页⾯索引值乘上每页记录数,得到是当前
页⾯以前的所有记录数,Skip是跳过这些记录,⽽得到后⾯的所有记录,Take(PageSize)是得到PageSize条数的记录,⽐如,我们想要第三页的记录,这个页⾯的索引值为
2(因为索引值从0开始)PageIndex=2,每页显⽰5条记录,PageSize=5,就是要跳过list中的前10条记录,然后再取前5条记录,即取list 中的第11条到第15条记录,也就是第3页的记录了。
在这⾥,微软提供了Skip和Tabke函数,让我们做起分页来,得⼼应⼿。
接下来是this.AddRange()函数,可以把批量的数据放到当前集合中(因为NewList本⾝就是⼀个集合)。
代码的后半部分是两个属性:
public bool HasPreviousPage
{
get { return (PageIndex > 0); }
}
gridview不显示
public bool HasNextPage
{
get { return (PageIndex + 1 < AllPages); }
}
这两个属性是为页⾯显⽰“上⼀页”和“下⼀页”,因为当我们显⽰第⼀页的时候,“上⼀页”是不需要显⽰的,如果最后⼀页,是没有“下⼀
页“的,所以在这⾥定义了两个属性,来判断是否有上⼀页和下⼀页。
先看HasPreviousPage属性,如果PageIndex是⼤于0的,说明不是在第⼀页,所以就反回true,如果⼩于等于0(在这⾥⼩于0是没有意思义的,因为页⾯的索引值最⼩是0),说明是第⼀页,所以返回是false。
再看HasNextPage属性,因为页⾯索引值的最⼤数,与页⾯的最⼤数差1(索引从0开始的原因),所以当PageIndex+1⼩于AllPages时,说没有没到最后⼀页,返回值是true,如果PageIndex+1⼤于等于AllPages时(⼤于也没有意义),说明是最后⼀页,返回值为false。
4、添加NewsController。选中Controller,右键添加⼀个NewsController 的Controller。
代码如下:
Code
关于两个Index重载,我们在设计完Views再讨论。
5、添加View。选中NewsController,右键,添加View,会弹出如下图:
在这⾥,我们选中ws,在View content下拉列表中选择List(因为要实现列表分页)。
Index.aspx页⾯代码如下:
Code
代码的前半部分,很好理解。
代码的后半部分,我们来分析⼀下,⾸页,是采⽤
Html.RouteLink(“⾸页”,”UpcomingNews”,new{ page=0}),是要定位到名称为”UpcomingNews”的路由,这个路由在Global.asax中,代码如下:
routes.MapRoute(
"UpcomingNews",
"News/page/{page}",
new { controller = "News", action = "Index" });
路由的名称是”UpcominNews”,Url格式是News/page/{page},News和page是url的⼀种格式,后⾯{page}是参数,这个参数的名称要与View中,后半部分的new{page=0}的page,以及NewsController中的⽅法Index(int? page)中的page都必需统⼀。如果有请求
News/page/2的url,实际上请求的是 news?page=2的页⽹(路由在ASP.NET MVC官上有说明)。
⾸页为中的page=0,最终会成为NesController中Index(int? page)⽅法,的实参,返回⾸页数据(及数据库表的前5条数据)。
上⼀页,在当前页数PageIndex的基础上减1。
下⼀页,在当前页数PageIndex的基础上加1
(注:上⾯的加减1都不会越界,因为当显⽰第⼀页时,“上⼀页”的超连接就不会显⽰。当最后⼀页时,“下⼀页”的超连接就不会显⽰)
尾页同⾸页。
现在的⼀个问题是“转到”第⼏页的实现,我们知道,转到第⼏页的“⼏”,得⽤户输⼊,所以这⾥⽤⼀个Html.TextBox来实现,完全代码是
<%=Html.TextBox("pageindex", Model.PageIndex, new {})%>
最终会⽣成⼀个名称为pageindex的intup,类型为Text,它的值始终为当前的索引页值Model.PageIndex,其中有⼀个宽度的属性new {}。
同时还有⼀个<input type="submit" value="转到" id="sub" />⽤来向后参提交。因为代码中有<form>表单,所以可以在NewsController中接收这个提交。
Index(FormCollection formValues)⽅法⽤来处理这个提交。这⾥会从formValues.GetValue("pageindex").AttemptedValue中午到客户端⽤户输⼊“pageindex”⽂本框中的值。从⽽来完成定向。
⾄此,我们就⽤ASP.NET MVC实现了⼀个分页功能,相⽐之下要难ASP.NET的GridView⾃动分页好多。
在这个例⼦中,我们在Models层中提供了实体类及news表的集合类。在Controller层增加了NewsController类。在View层增加了News的view,从M-V-C⾓度,分别完成了对分页的功能。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。