ASP.NET MVC 数据分页思想及解决方案代码
作为一个程序猿,数据分页是每个人都会遇到的问题。解决方案更是琳琅满目,花样百出。但基本的思想都是差不多的。
下面给大家分享一个简单的分页器,让初学者了解一下最简单的分页思想,以及在ASP.NET MVC中的简单实现与应用。
一,定义分页器类
在ASP.NET MVC中,分页的数据源可能是各种不同的类型,所以最好使用泛型来定义。
public class PagingHelper<T>
二,基本三要素
实现分页人所共知的三个基本属性:
DataSource:数据源,要知道数据源共计多少条数据,会对应一个数据源的方法-Count(),
PageSize:来描述每页显示的记录的条数。
PageIndex:当前页的索引值,一般第一页的索引值为0,当然为了表示方便,可以从1开始,并且后面默认为从1开始。
//分页数据源
public IEnumerable<T> DataSource { get;private set; }
//每页显示记录的数量
public int PageSize { get; private set; }
//当前页数
public int PageIndex { get; set; }
三,扩展属性
有了上述三要素,我们可以推论其他三个重要属性
PageCount:总页数,其值取大于或等于 DataSource.Count/PageSize 的最小整数,比如5.2页,其实就是6页。
HasPrev:用来判断是否有上一页,如果索引 PageIndex 从1开始,那就是判断 PageIndex > 1 是否成立。
HasNext:用力判断是否有下一页,如果索引 PageIndex 从1开始,需判断 PageIndex < PageCount 是否成立。
//分页总页数
public int PageCount { get;private set; }
//是否有前一页
public bool HasPrev { get { return PageIndex > 1; } }
//是否有下一页
public bool HasNext { get { return PageIndex < PageCount; } }
四,核心方法
最后就是需要实现分页的核心-获取分页数据的方法:
GetPagingData():获取当页的数据,一般常用的手段是跳过PageIndex*PageSize条记录,然后取PageSize条数据。
在.NET中有很多方法可以实现这一过程,这里介绍2个最简单的:
方法1,从序列的指定位置返回指定数量的连续元素:
public static IEnumerable<TSource> Take<TSource>( this IList<TSource> list, int start, int count )
{
for ( int index = start; index < Math.Min( start + count, list.Count ); index++ )
{
yield return list[index];//yield关键字的用法大家可以参详其他文章
}
}
那么我们的GetPagingData()方法就要这么写:
//获取当前页数据
public IEnumerable<T> GetPagingData()
{
return DataSource.ToList<T>().Take((PageIndex-1)×PageSize,PageSize);
}
其实我更倾向与第二种方法,就是使用IEnumerable<T>的扩展方法:
Skip(int count):跳过序列中指定数量的元素,然后返回剩余的元素
Take(int count):从序列的开头返回指定数量的连续元素。
那么我们的GetPagingData()只需要这么写就完事:
//获取当前页数据
public IEnumerable<T> GetPagingData()
{
return DataSource.Skip((PageIndex - 1) * PageSize).Take(PageSize);
}
这句代码就是跳过 PageIndex - 1) * PageSize 条数据,再取 PageSize 条数据 ,刚刚好就是我们需要的当前页的数据。
五,构造函数
实例化一个分页器的时候,我们需要对它进行初始化:
public PagingHelper(int pageSize, IEnumerable<T> dataSource)
{
this.PageSize = pageSize > 1 ? pageSize : 1;
this.DataSource = dataSource;
PageCount = (int)Math.Ceiling(dataSource.Count() / (double)pageSize);
}
真正的使用中,你可以重写分页器类,根据你的需要来控制哪些字段是只读的。比如你想随时改变页面元素的数量,那么你可以把PageSize设置为可读写的属性。
至此,这个分页器我们就完工拉。
六,与ASP.NET MVC的简单结合
首先我们通过VS创建一个空的基于Razor视图引擎的ASP.NET MVC3 Web应用程序,命名为JohnConnor.Web
对创建过程或Razor不太了解的看官,请移步 ASP.NET MVC Razor视图引擎攻略 <传送门> ,这里就不再赘述了。
然后我们需要进行以下几步
1,Models文件夹下,添加Student.cs文件,添加以下代码,为了演示方便这里模拟了一个数据源,实际中的数据源可能来自数据库。
模拟数据源
public class Student
{
public int Id { get; set; }
public string Name { get; set; }
}
public static class Students
{
public static IEnumerable<Student> data
{
get
{
return new List<Student>()
{
new Student{ Id=0, Name="John"},
new Student{ Id=1, Name="Marry"},
new Student{ Id=2, Name="Andy"},
new Student{ Id=3, Name="Tom"},
new Student{ Id=4, Name="Lydia"},
new Student{ Id=5, Name="Chris"},
new Student{ Id=6, Name="Justin"},
new Student{ Id=7, Name="Susan"}
};
}
}
}
2,Models文件夹下,添加PagingHelper.cs文件,添加我们上述分页器类。
分页器Code
public class PagingHelper<T>
{
//分页数据源
public IEnumerable<T> DataSource { get; private set; }
//每页显示记录的数量
public int PageSize { get; private set; }
//当前页数
public int PageIndex { get; set; }
//分页总页数
public int PageCount { get; private set; }
//是否有前一页
public bool HasPrev { get { return PageIndex > 1; } }
//是否有下一页
public bool HasNext { get { return PageIndex < PageCount; } }
//构造函数
public PagingHelper(int pageSize, IEnumerable<T> dataSource)
{
this.PageSize = pageSize > 1 ? pageSize : 1;
this.DataSource = dataSource;
PageCount = (int)Math.Ceiling(dataSource.Count() / (double)pageSize);
}
//获取当前页数据
public IEnumerable<T> GetPagingData()
{
return DataSource.Skip((PageIndex - 1) * PageSize).Take(PageSize);
}
}
3,在Controller文件夹下添加控制器命名为HomeController,添加以下代码。
控制器Code
public class HomeController : Controller
{
public ActionResult Index(int pageIndex=1)
{
PagingHelper<Student> StudentPaging = new PagingHelper<Student>(2, Students.data);//初始化分页器
StudentPaging.PageIndex = pageIndex;//指定当前页
return View(StudentPaging);//返回分页器实例到视图
}
}
4,在View文件夹下添加Home文件夹,并新增视图文件Index.cshtml,添加以下代码。
视图Code
@using JohnConnor.Web.Models
@model PagingHelper<Student>
@{
ViewBag.Title = "Index";
}
<h2>Index</h2>
@foreach (var Data in Model.GetPagingData())
{
<p>ID:@Data.Id Name:@Data.Name</p>
}
<p>
@if (Model.HasPrev)
{
<a href="@Url.Action("Index", "Home", new { pageIndex = Model.PageIndex - 1 })">上一页</a>
}
else
{
<em style="color:Gray">上一页</em>
}
@if (Model.HasNext)
{
<a href="@Url.Action("Index", "Home", new { pageIndex = Model.PageIndex + 1 })">下一页</a>
}
else
{
<em style="color:Gray">下一页</em>
}
</p>
5,在Global.asax中配置路由,我们修改一下默认路由就可以了。
路由表配置
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // 路由名称
"{controller}/{action}/{pageIndex}", // 带有参数的 URL
new { controller = "Home", action = "Index", pageIndex = UrlParameter.Optional } // 参数默认值
);
}
现在保存之后F5运行,就可以看到一个简单的分页程序了。

URL在进行了路由配置之后,也不会再是http://localhost:1234/Home/Index?pageIndex=1
而变成了http://localhost:1234/Home/Index/1 这样的静态URL,更简洁,更美观。
ASP.NET MVC 数据分页思想及解决方案代码的更多相关文章
- ASP.NET MVC 数据分页
作为一个菜鸟级的程序猿,总结一下学到的两种数据分页. 1.真分页 真分页就是需要时从数据库里读出需要多的数据,利用存储过程可实现.网上的分页SQL特别多,数据库自带的一些方法也可方便的帮助分页,但是我 ...
- 七天学会ASP.NET MVC (二)——ASP.NET MVC 数据传递
通过第一天的学习之后,我们相信您已经对MVC有一些基本了解. 本节所讲的内容是在上节的基础之上,因此需要确保您是否掌握了上一节的内容.本章的目标是在今天学习结束时利用最佳实践解决方案创建一个小型的MV ...
- 学习ASP.NET MVC(十一)——分页
在这一篇文章中,我们将学习如何在MVC页面中实现分页的方法.分页功能是一个非常实用,常用的功能,当数据量过多的时候,必然要使用分页.在今天这篇文章中,我们学习如果在MVC页面中使用PagedList. ...
- 七天学会ASP.NET MVC (二)——ASP.NET MVC 数据传递 【转】
http://www.cnblogs.com/powertoolsteam/p/MVC_two.html 通过第一天的学习之后,我们相信您已经对MVC有一些基本了解. 本节所讲的内容是在上节的基础之上 ...
- asp.net MVC通用分页组件 使用方便 通用性强
asp.net MVC通用分页组件 使用方便 通用性强 该分页控件的显示逻辑: 1 当前页面反色突出显示,链接不可点击 2 第一页时首页链接不可点击 3 最后一页时尾页链接不可点击 4 当前页面左 ...
- ASP.NET MVC 简单分页代码
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...
- Asp.net MVC 简单分页 自做简单分页
Asp.net MVC 简单分页: public static string Pager(int page,int pageSize,int total) { ...
- AJAX跨域调用ASP.NET MVC或者WebAPI服务的解决方案
问题描述 当跨域(cross domain)调用ASP.NET MVC或者ASP.NET Web API编写的服务时,会发生无法访问的情况. 重现方式 使用模板创建一个最简单的ASP.NET Web ...
- JQuery对ASP.NET MVC数据进行更新删除
以前学习ASP.NET MVC时,学习与应用,操作过数据显示,添加,编辑,更新和删除等功能. 很多方法是相通的,看自己是怎样来进行方便,快捷,高效率. 今天Insus.NET写的练习,是直接对绑定在T ...
随机推荐
- Quartz Scheduler(2.2.1) - Usage of SimpleTrigger
SimpleTrigger should meet your scheduling needs if you need to have a job execute exactly once at a ...
- unity3d遍历出Cube里面所有子对象
cube目录下有n个cube,可不可以一下子遍历出所有的对象,而不用一个一个的find?find(“Cube1”) 1.foreach(Transform ts in cube) 2.cub ...
- HDOJ2021发工资咯:)
发工资咯:) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- hdoj1423 最长上升公共子序列
hdoj1423 题目分析: 两个数组a[n1] , b[n2], 求最长上升公共子序列. 我们可用一维存储 f[i] 表示 b 数组以 j 结尾, 与 a[] 数组构成的最长公共上升子序列. 对数组 ...
- 在Ubuntu中USB连接手机调试
1.打开手机USB调试功能 显示“开发者选项”(开发者选项默认隐藏,一般需要进入到“设置”-->“关于手机”连续点击七次,可将“开发者选项显示出来”) 将“开发者选项”设置为“开启”状态 打开U ...
- DOS批处理命令-goto命令
goto是一个流程控制语句 rem goto语句是一个大家都不怎么喜欢的语句,因为他的随意性太强,导致可维护性大大的降低. 语法: goto [lable] [lable]是bat程序中任意定义的 ...
- 安全接口 interface --显示实现接口
前言:当我们定义接口的成员的时候不需要写访问控制符,因为它是默认public的,也只能是public.当一个类要实现这个接口的时候,自然要公开其成员.一直以来我都这么做. interface Inte ...
- jQuery实现图片轮播
之前有碰到过jQuery实现列表自动滚动,这次的图片轮播在原理上与之相同,只有一些细微的差别,就是需要在图片的右下角显示当前图片的序号,效果如下: 先看一看html代码,以及对应的css代码: < ...
- IPoint从自定义的投影坐标系转换到自定义的地理坐标系
IPoint pointStart = new PointClass(); pointStart = xyPolyline.FromPoint; ISpatialReferenceFactory pS ...
- HTML5之拖放
- Draggable 标签 文件拖放 99年IE5开始,05后所有浏览器支持(除了opera) <li id=be draggable=true ondragstart="star ...