ASP.NET MVC 数据分页
2014-02-06 17:36
295 查看
作为一个菜鸟级的程序猿,总结一下学到的两种数据分页。
1.真分页
真分页就是需要时从数据库里读出需要多的数据,利用存储过程可实现。网上的分页SQL特别多,数据库自带的一些方法也可方便的帮助分页,但是我还是比较喜欢一大神教给我的“虚表分页法”。
(此例用新闻表为例,pageIndex从0开始计)
(1)创建虚表,含两个字段(ID:自身编号;VID:用来存储新闻表的ID)
create table #V_Table ( ID int identity(1,1), VID int )
(2)将新闻表ID的插入虚表的VID列
insert into #V_Table(VID) select NewsID from News_Table order by NewsID desc
(3)因为虚表的ID是连续的,一次可方便的查找出需要条数的数据
select T1.* from News_Table T1,#V_Table T2 where T1.NewsID=T2.VID and T2.ID between @PageIndex*@PageSize+1 and (@PageIndex+1)*@PageSize
2.假分页
假分页就是一次将所有数据从数据库读出来,然后显示的时候分页。最近做一个小项目就用到了分页,就顺便用了此方法。
http://www.cr173.com/html/15481_1.html
因为项目使用的是MVC,所以需要几个地方的代码的实现,此例使用Student类作为数据源模拟。
(1)Models文件夹下,添加PagingHelper.cs文件
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);
}
}
(2)控制器
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);//返回分页器实例到视图
}
}
(3)视图
@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>
(4)路由表配置
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 } // 参数默认值
);
}
3.写在最后的话
其实,这篇博文不算原创,但是作为一个菜鸟,“拿来主义”是也可取的,最重要的是理解了,最最重要的是学习到其中的思想。
希望对刚入门的小弟弟们有帮助,也希望大牛们不吝赐教。
1.真分页
真分页就是需要时从数据库里读出需要多的数据,利用存储过程可实现。网上的分页SQL特别多,数据库自带的一些方法也可方便的帮助分页,但是我还是比较喜欢一大神教给我的“虚表分页法”。
(此例用新闻表为例,pageIndex从0开始计)
(1)创建虚表,含两个字段(ID:自身编号;VID:用来存储新闻表的ID)
create table #V_Table ( ID int identity(1,1), VID int )
(2)将新闻表ID的插入虚表的VID列
insert into #V_Table(VID) select NewsID from News_Table order by NewsID desc
(3)因为虚表的ID是连续的,一次可方便的查找出需要条数的数据
select T1.* from News_Table T1,#V_Table T2 where T1.NewsID=T2.VID and T2.ID between @PageIndex*@PageSize+1 and (@PageIndex+1)*@PageSize
2.假分页
假分页就是一次将所有数据从数据库读出来,然后显示的时候分页。最近做一个小项目就用到了分页,就顺便用了此方法。
http://www.cr173.com/html/15481_1.html
因为项目使用的是MVC,所以需要几个地方的代码的实现,此例使用Student类作为数据源模拟。
(1)Models文件夹下,添加PagingHelper.cs文件
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);
}
}
(2)控制器
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);//返回分页器实例到视图
}
}
(3)视图
@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>
(4)路由表配置
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 } // 参数默认值
);
}
3.写在最后的话
其实,这篇博文不算原创,但是作为一个菜鸟,“拿来主义”是也可取的,最重要的是理解了,最最重要的是学习到其中的思想。
希望对刚入门的小弟弟们有帮助,也希望大牛们不吝赐教。
相关文章推荐
- ASP.NET MVC 数据分页思想及解决方案代码
- ASP.NET MVC 中的数据分页
- [翻译]在ASP.NET MVC中绑定数据(包括分页和排序)
- 我要学ASP.NET MVC 3.0(十六): MVC 3.0 实例系列之表格数据的分页
- 我要学ASP.NET MVC 3.0(十六): MVC 3.0 实例系列之表格数据的分页
- ASP.NET MVC 中的数据分页(二)
- asp.net mvc 中利用jquery datatables 实现数据分页显示
- ASP.NET MVC 中的数据分页(四)
- 一起谈.NET技术,详解ASP.NET MVC数据分页
- ASP.NET MVC 中的数据分页(三
- Asp.net MVC 中利用jquery datatables 实现数据分页显示功能
- ASP.NET MVC 2入门演练 6 —— 分页查询数据
- 【EntityFramework系列教程三,翻译】在ASP.NET MVC程序中使用EntityFramework对数据进行排序、过滤筛选以及实现分页
- ASP.NET MVC 3.0(十六): MVC 3.0 实例系列之表格数据的分页
- asp.net mvc jqgrid 同一个页面查询不同的表,jqgrid显示不同表的表头和数据并且分页
- ASP.NET MVC 数据分页思想及解决方案代码
- 打造通用ASP.NET数据分页控件
- ASP.net的ACCESS数据分页方案
- Asp.net使用jQuery实现数据绑定与分页
- ASP.NET MVC 入门7、Hellper与数据的提交与绑定