一起谈.NET技术,详解ASP.NET MVC数据分页

ASP.NET MVC框架已经进入2.0时代,本文将从ASP.NET MVC数据分页谈起,希望能对大家有所帮助。

在网页上进行表格资料或其他显示资料的分页是一种十分常见的需求,以前我们有 GridView 或 DataPager 可以帮我们自动分页,虽然到了 ASP.NET MVC 一切全部重头来过,但我们也不用真的那麽辛苦的自己实做分页,因为早就有人帮我们写好程式并开放原始码分享给这个世界了。

如果你已经体会到在 ASP.NET MVC 中妥善利用强型别(Strong Typed)特性进行开发的优点时,你将会发现搭配 Visual Studio 2008 进行专桉开发的过程有多美妙。以下我先举一个简单的例子:

你可以在 Controller 中定义一个 Action 方法,并在裡面先取得所有需显示在 View 中的资料,如果你用 LINQ to SQL 的话,可以直接传入 IQueryable 型别的物件到 View 中,当成 View 裡面使用的 Model,这样可以享受延迟载入(Defered Loading) 的效果。

代码


public ActionResult Index()
{
IQueryable<Customer> custs =
from cust in db.Customers
where cust.City == "Taiwan"
select cust;

return View(custs);
}
public ActionResult Index()
{
IQueryable<Customer> custs =
from cust in db.Customers
where cust.City == "Taiwan"
select cust;

return View(custs);
}

之后在你的 View 中宣告继承时可透过泛型指派 IQueryable 进去:


<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<IQueryable<Customer>>" %>
<%@ Page Language="C#"
Inherits="System.Web.Mvc.ViewPage<IQueryable<Customer>>" %>

或是转型成统一个 IEnumable ,这也是比较常见的用法:


<%@ Page Language="C#"
Inherits="System.Web.Mvc.ViewPage<IEnumable<Customer>>" %>
<%@ Page Language="C#"
Inherits="System.Web.Mvc.ViewPage<IEnumable<Customer>>" %>

然后你就可以利用 foreach 取出所有资料并将资料显示出来了:

代码


<table>
<% foreach (var item in Model) { %>
<tr>
<td><%= Html.Encode(item.ID) %></td>
<td><%= Html.Encode(item.Name) %></td>
<td><%= Html.Encode(item.Tel) %></td>
</tr>
<% } %>
</table>
<table>
<% foreach (var item in Model) { %>
<tr>
<td><%= Html.Encode(item.ID) %></td>
<td><%= Html.Encode(item.Name) %></td>
<td><%= Html.Encode(item.Tel) %></td>
</tr>
<% } %>
</table>

这就是标准的 ASP.NET MVC 取得资料并显示在 View 中的 Pattern。

  我们最近在开发 ASP.NET MVC 专桉的过程中,除了自行研究如何有效分页以外,也上网找了好几套 ASP.NET MVC 分页的解决方桉,最后我们总结出一个最好用的就是这个元件 ( Paging with ASP.NET MVC )。

  要利用这个元件进行资料分页,不外乎有几件事必须做到:

  需传入一个 page 参数到 Action 中,用以指定你目前要显示「第几页」的资料。

  准备传入的资料(Model),可透过 Paging with ASP.NET MVC 元件中提供的 Extension Method 将 IList, IQueryable, 或 IEnumable 型别的资料转换成 IPagedList 的型别,并传入 View 中。

透过一个自订的 Html Helper 在 View 中必须显示「分页导览列」的资讯 (如下图)

  依据上面三个步骤进行修改,Action 的程式码会变成这样:


view plaincopy to clipboardprint?
// 分页后每页显示的笔数
int defaultPageSize = 10;

// 传入 page 参数 ( 透过 Model Binder 绑进来的 )
public ActionResult Index(int? page)
{
IQueryable<Customer> custs =
from cust in db.Customers
where cust.City == "Taiwan"
select cust;

// 计算出目前要显示第几页的资料 ( 因为 page 为 Nullable<int> 型别 )
int currentPageIndex = page.HasValue ? page.Value - 1 : 0;

// 透过 ToPagedList 这个 Extension Method 将原本的资料转成 IPagedList<T>
return View(custs.ToPagedList(currentPageIndex, defaultPageSize));
}
// 分页后每页显示的笔数
int defaultPageSize = 10;

// 传入 page 参数 ( 透过 Model Binder 绑进来的 )
public ActionResult Index(int? page)
{
IQueryable<Customer> custs =
from cust in db.Customers
where cust.City == "Taiwan"
select cust;

// 计算出目前要显示第几页的资料 ( 因为 page 为 Nullable<int> 型别 )
int currentPageIndex = page.HasValue ? page.Value - 1 : 0;

// 透过 ToPagedList 这个 Extension Method 将原本的资料转成 IPagedList<T>
return View(custs.ToPagedList(currentPageIndex, defaultPageSize));
}

然后在 View 中显示资料的地方,透过一个自订的 Html Helper 方法显示分页资讯。

首先必须先修改传入 View 的 Model 型别


<%@ Page Language="C#"
Inherits="System.Web.Mvc.ViewPage<IPagedList<Customer>>" %>
<%@ Page Language="C#"
Inherits="System.Web.Mvc.ViewPage<IPagedList<Customer>>" %>

然后再宣告汇入 MvcPaging 命名空间,好让 Html.Pager 这个 Html Helper Method 可以使用。

备注: 也可以在 web.config 设定,请参考 ASP.NET 如何预设汇入指定的命名空间(Namespace) 文章!


<%@ Import Namespace="MvcPaging"%>
<%@ Import Namespace="MvcPaging"%>

然后原本显示资料的程式「完全不用改写」,只要加上「分页导览列」即可:

代码


view plaincopy to clipboardprint?
<table>
<% foreach (var item in Model) { %>
<tr>
<td><%= Html.Encode(item.ID) %></td>
<td><%= Html.Encode(item.Name) %></td>
<td><%= Html.Encode(item.Tel) %></td>
</tr>
<% } %>
</table>

<div class="pager">
<%= Html.Pager(Model.PageSize, Model.PageNumber, Model.TotalItemCount) %>
</div>
<table>
<% foreach (var item in Model) { %>
<tr>
<td><%= Html.Encode(item.ID) %></td>
<td><%= Html.Encode(item.Name) %></td>
<td><%= Html.Encode(item.Tel) %></td>
</tr>
<% } %>
</table>

<div class="pager">
<%= Html.Pager(Model.PageSize, Model.PageNumber, Model.TotalItemCount) %>
</div>

 

就这样简单几个步骤即可完成 ASP.NET MVC 内的分页了,是不是还不错呢!

时间: 2024-09-07 16:19:27

一起谈.NET技术,详解ASP.NET MVC数据分页的相关文章

详解ASP.NET MVC数据分页

ASP.NET MVC框架已经进入2.0时代,本文将从ASP.NET MVC数据分页谈起,希望能对大家有所帮助. 在网页上进行表格资料或其他显示资料的分页是一种十分常见的需求,以前我们有 GridView 或 DataPager 可以帮我们自动分页,虽然到了 ASP.NET MVC 一切全部重头来过,但我们也不用真的那麽辛苦的自己实做分页,因为早就有人帮我们写好程式并开放原始码分享给这个世界了. 如果你已经体会到在 ASP.NET MVC 中妥善利用强型别(Strong Typed)特性进行开发

一起谈.NET技术,详解ASP.NET MVC 2中的新ADO.NET实体框架

.NET框架4.0的发行推出了许多优秀的增强功能,其中当首推ADO.NET实体框架.该框架已经克服了以前的许多错误,并提供了一组增强的API,其中包括许多新的LINQ to SQL框架方面的改善.在本文中,我们将使用这些API的功能来创建一个通用版本的数据仓库. 一.实体框架概述 实体框架针对数据模型提供了一些更方便的操作方法.默认情况下,设计器可以生成一个描述数据库的模型. 尽管表格间的映射未必都是1:1的映射.每个表格使用一个ObjectSet加以描述,进而ObjectSet对象又提供了相应

一起谈.NET技术,[翻译]ASP.NET MVC 3 RC 发布通告

今天早上,ASP.NET组发布了ASP.NET 3 RC版(release candidate).你们可以从这里进行下载here. ASP.NET MVC 3是个很完美的发布,增加了大量的功能改进.它可以向后兼容ASP.NET MVC V1 和 V2,可以轻易的升级你现有的项目(可以阅读发布须知,根据里面的步骤去做).你还可以通过我之前发表的博客文章来学习ASP.NET MVC 3的很多功能.  今天的ASP.NET MVC 3 RC build 包含了一些附加的功能改进(除了修正了一些bug外

一起谈.NET技术,跟ASP.NET MVC一起使用jQuery

藉由ASP.NET MVC内置的扩展性,开发人员便可以使用第三方库,例如jQuery.在使用ASP.NET Webforms的时候,如果使用jQuery而不是ASP.NET AJAX,难度会比较大. 刚开始撰写本文的时候,ASP.NET MVC的版本是Preview 4,有些在Preview 4中使用的技术可能无法在早期版本中正常工作.Preview 4可以在CodePlex上下载. 初步配置 我不打算把它写成一篇完整的jQuery指南,只是简单给出几个跟ASP.NET MVC一起使用这款Jav

详解Asp.net MVC DropDownLists

Asp.net MVC中的DropDownLists貌似会让一开始从Asp.net Forms转过来的程序员造成不 少迷惑.这篇文章讲述了为了使用DropDownLists,你需要在Asp.Net MVC中知道的方方面 面. DropDownList,ComboBox,无论你喜欢怎么称呼这些,他们毫无例外的会被生成为html select标签. 在<select>开标签和</select>闭标签之间,每一个列表元素都必 须被包裹于<option>标签.当然你也可以使用&

详解ASP.NET MVC 2中的新ADO.NET实体框架

.NET框架4.0的发行推出了许多优秀的增强功能,其中当首推ADO.NET实体框架.该框架已经克服了以前的许多错误,并提供了一组增强的 API,其中包括许多新的LINQ to SQL框架方面的改善.在本文中,我们将使用这些API的功能来创建一个通用版本的数据仓库. 一.实体框架概述 实体框架针对数据模型提供了一些更方便的操作方法.默认情况下,设计器可以生成一个描述数据库的模型. 尽管表格间的映射未必都是1:1的映射.每个表格使用一个ObjectSet加以描述,进而ObjectSet对象又提供了相

详解ASP.NET MVC的筛选器_实用技巧

在ActionInvoker对Action的执行过程中,除了通过利用ActionDescriptor对Action方法的执行,以及之前进行的Model绑定与验证之外,还具有一个重要的工作,那就是对相关筛选器(Filter)的执行.ASP.NET MVC的筛选器是一种基于AOP(面向方面编程)的设计,我们将一些非业务的逻辑实现在相应的筛选器中,然后以一种横切(Crosscutting)的方式应用到对应的Action方法.当Action方法执行前后,这些筛选器会自动执行.ASP.NET MVC提供了

详解ASP.NET MVC下的异步Action的定义和执行原理_实用技巧

Visual Studio提供的Controller创建向导默认为我们创建一个继承自抽象类Controller的Controller类型,这样的Controller只能定义同步Action方法.如果我们需要定义异步Action方法,必须继承抽象类AsyncController.这篇问你讲述两种不同的异步Action的定义方法和底层执行原理. 一.基于线程池的请求处理 ASP.NET通过线程池的机制处理并发的HTTP请求.一个Web应用内部维护着一个线程池,当探测到抵达的针对本应用的请求时,会从池

一起谈.NET技术,在ASP.NET MVC中进行TDD开发

TDD介绍 TDD是一种开发方法,全称是Test-Driven development,中文是测试驱动开发.作者是Kent Beck.首先让我介绍一下三种常见的开发方式: 第一种:先Coding,然后Bug Fix. 第二种:先Coding,然后Unit Test,最后Bug Fix.很显然用了单元测试的比第一种开发方式要好不少. 第三种:就是本文要说的TDD,它的方式和第二种恰恰相反.TDD先设计单元测试,然后再Coding,最后修复Bug.看下图: TDD开发过程可以看成:给制自己制定一个目