ASP.NET MVC 3.0(十六): MVC 3.0 实例系列之表格数据的分页

摘要:
问题分析通过上节的学习我们知道,在MVC程序中使用参数可以实现排序,那么我们使用参数怎么实现分页呢?②pageSize每页显示条数:当前表格中显示几条数据。

ASP.NET MVC 3.0(一): MVC 3.0 的新特性 摘要

ASP.NET MVC 3.0(二): MVC的概念及MVC 3.0开发环境

ASP.NET MVC 3.0(三): 初识MVC的Url映射潜规则Routing

ASP.NET MVC 3.0(四): 我要MVC潜规则之配置Routing

ASP.NET MVC 3.0(五): 入手Controller/Action

ASP.NET MVC 3.0(六): MVC 3.0创建你的View视图

ASP.NET MVC 3.0(七): MVC 3.0 新的Razor引擎

ASP.NET MVC 3.0(八): MVC 3.0 传递和保存你的Model

ASP.NET MVC 3.0(九): MVC 3.0 验证你的Model

ASP.NET MVC 3.0(十): MVC 3.0 使用 Forms身份验证

ASP.NET MVC 3.0(十一): MVC 3.0 使用筛选器

ASP.NET MVC 3.0(十二): MVC 3.0 使用自定义的Html控件

ASP.NET MVC 3.0(十三): MVC 3.0 防止跨站点请求伪造 (CSRF) 攻击

ASP.NET MVC 3.0(十四): MVC 3.0 实例系列之创建数据表格

ASP.NET MVC 3.0(十五): MVC 3.0 实例系列之表格的排序

ASP.NET MVC 3.0(十六): MVC 3.0 实例系列之表格数据的分页

ASP.NET MVC 3.0(十七): MVC 3.0 实例之表格中数据的筛选

ASP.NET MVC 3.0(十八): MVC 3.0 实例系列之表格中合并排序、分页和筛选

ASP.NET MVC 3.0(十九): MVC 3.0 实例之使用开源控件实现表格排序和分页

概述

上节我们学习了如何在MVC 3应用程序中实现一个简单表格并在表格之中加上了排序的表头,使我们的表格在使用起了更加人性化,这些都是使用了MVC 3.0的相关特性来完成的。

我们在程序中添加了一个辅助类EmployeeGridModel,来显示我们的Grid的数据,包括所有要传递及初始化的数据,在表格排序的时候起到了很大的作用,同样的我们在分页的时候也需要这样的辅助类。

这节我们继续使用MVC的新特性来为Grid中的数据添加分页功能,有了分页功能,表格就不会显得单调,显示起来就更加有美感。

问题分析

通过上节的学习我们知道,在MVC 程序中使用参数可以实现排序,那么我们使用参数怎么实现分页呢?分页有需要那些参数呢?

首先:作为一个表格我们必须知道他总共有多少条数据TotalRecordCount,每页显示几条数据PageSize,这样就确定了表格的总页数PageCount

其次:我们要知道表格中的数据要从哪一页开始索引显示CurrentPageIndex

这样我们就初步把一些参数设想出来了,为了简单期间,我们每页默认显示5条数据,你也可以设置成你想要的值。而数据总条数可以从数据库中得到,

总结后得出参数:

①page当前页:当前表格索引页。

②pageSize每页显示条数:当前表格中显示几条数据。

修改辅助类

修改Model文件夹的EmployeeGridModel类

ASP.NET MVC 3.0(十六): MVC 3.0 实例系列之表格数据的分页第1张

向类中添加如下代码(以前的代码不变后续功能要使用)

......................................
publicEmployeeGridModel()
{
//默认值 每页显示5条记录 从第1页开始this.PageSize =5;
this.CurrentPageIndex =1;
}
///<summary>///当前页的索引
///</summary>publicintCurrentPageIndex { get; set; }
///<summary>///每页显示的记录条数
///</summary>publicintPageSize { get; set; }
///<summary>///总记录条数
///</summary>publicintTotalRecordCount { get; set; }
///<summary>///分页总数
///</summary>publicintPageCount
{
get
{
if(TotalRecordCount %PageSize ==0)
{
returnTotalRecordCount /PageSize;
}
else
{
returnTotalRecordCount /PageSize +1;
}
}
}

在这里我们设置了分页默认每页显示5条记录,从第一页开始显示。

创建Action

在EmployeeController添加名为Paged的方法

该方法包含两个参数page和pageSize

代码如下

publicActionResult Paged(intpage =1, intpageSize =5)
{
var model
=newEmployeeGridModel
{
CurrentPageIndex
=page,
PageSize
=pageSize,
//确定记录总数(才能计算出PageCount页数)TotalRecordCount =this.DataContext.Employee.Count()
};
//获取当前页的信息model.Employees =this.DataContext.Employee
.Skip((model.CurrentPageIndex
-1) *model.PageSize)
.Take(model.PageSize);
returnView(model);
}

首先我们初始化一个辅助类EmployeeGridModel,读取了数据库中表的记录条数,为相关属性设置默认值,返回一个辅助类的Employeelist

注意:此处我们的OrderBy可以参照上篇中的具体操作,这里就不多赘述。

创建视图View

为Paged的Action添加一个视图View,选择强类型为EmployeeGridModel

ASP.NET MVC 3.0(十六): MVC 3.0 实例系列之表格数据的分页第2张

修改代码为

@model MVC3.Grid.Models.EmployeeGridModel
@{
ViewBag.Title = "Paged";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>分页列表</h2><p><i>总共有 @Model.TotalRecordCount 条记录,每页显示 @Model.PageSize 条</i><i>你正在查看的是 @Model.PageCount 页的第 @Model.CurrentPageIndex 页</i></p><table border="1"width="100%"style="text-align: center; border-collapse: collapse"><tr><th>编号</th><th>姓名</th><th>性别</th><th>生日</th><th>是否婚配</th></tr>
@foreach (var item in Model.Employees)
{
<tr><td>@item.EmployeeNO</td><td>@item.EmployName</td><td>@item.Sex</td><td>@item.Birthday</td><td>
@if (item.Marital == "1")
{
@:@("是")
}
@if (item.Marital != "1")
{
@:@("否")
}
</td></tr>
}
<tr><td colspan="5">&nbsp</td></tr></table>

这样一来,我们的页面基本就算是做好了,运行起来看看

ASP.NET MVC 3.0(十六): MVC 3.0 实例系列之表格数据的分页第3张

此时我们的表格数据基本已经是完成了的,每页显示5条,从第一页开始,数据都跟数据库完全符合。好下面我们继续来学习如何创建分页控件。

创建分页链接

首先我们看看一般的分页控件是怎么形态

ASP.NET MVC 3.0(十六): MVC 3.0 实例系列之表格数据的分页第4张

我们可以看到分页控件是由一个一个的分页链接来组成的,每点击一次就有不同的数据筛选出来。

下面我们就创建分页链接

鼠标右击Shared文件夹--新建--视图

新建名为_SmartLink的分部视图

选择强类型视图EmployeeGridModel

ASP.NET MVC 3.0(十六): MVC 3.0 实例系列之表格数据的分页第5张

修改_SmartLink代码为

@model MVC3.Grid.Models.EmployeeGridModel
@{
//文本编写器var razorWriter =ViewContext.Writer;
//判断当前链接是否选中if((bool)ViewData["Inactive"])
{
//将当前的Text输出 加入了css样式 该样式可以写在样式表、母版页、当前页中razorWriter.Write(string.Format("<span class=\"{0}\">{1}</span>", "pagerButtonDisabled", ViewData["Text"]));
}
else
{
//路由参数var routeData =newRouteValueDictionary { { "page", ViewData["PageIndex"].ToString() }, { "pageSize", Model.PageSize } };
var htmlAttributes
=newDictionary<string, object>();
//判断是否为选中状态 添加CSS样式if((bool)ViewData["Selected"])
{
htmlAttributes.Add(
"class", "pagerButtonCurrentPage");
}
else
{
htmlAttributes.Add(
"class", "pagerButton");
}
var linkMarkup
=Html.ActionLink(
ViewData[
"Text"].ToString(), //超链接文本Html.ViewContext.RouteData.Values["action"].ToString(), //ActionHtml.ViewContext.RouteData.Values["controller"].ToString(), //ControllerrouteData, //路由参数htmlAttributes //HTML属性适用于超链接).ToHtmlString();
razorWriter.Write(linkMarkup);
}
}

上面的代码注意就是判断当前的链接是否被选中,如果选中就执行Action方法添加CSS样式,否则就输出Html内容  

然后为Site.css样式表添加一些样式,保证代码的完整性

a.pagerButton, a.pagerButton:visited
{
border
:solid 0px black;
padding
:1px;
text-decoration
:none;
color
:#006;
margin
:0px 1px 0px 1px;}
a.pagerButton:hover
{
border
:solid 1px red;
color
:Black;}
a.pagerButtonCurrentPage
{
border
:solid 1px #00a;
padding
:1px;
text-decoration
:none;
color
:White;
background-color
:#006;
margin
:0px 1px 0px 1px;}
.pagerButtonDisabled
{
border
:none;
color
:#999;
padding
:1px;}

这样一个分页连接就做好了,如果选择某一页的话就会根据路由参数去匹配分页

//路由参数        var routeData =newRouteValueDictionary { { "page", ViewData["PageIndex"].ToString() }, { "pageSize", Model.PageSize } };

但是仅仅有了分页链接还是不够的,分页连接是一个一个单独的,我们需要把他做成一个列表形式的控件

ASP.NET MVC 3.0(十六): MVC 3.0 实例系列之表格数据的分页第4张

好下面我们就来创建分页控件。

创建分页控件

鼠标右击Shared文件夹--新建--视图

命名为_Pager,创建为EmployeeGridModel的强类型视图,选择分部视图,以便主页能调用他。

ASP.NET MVC 3.0(十六): MVC 3.0 实例系列之表格数据的分页第7张

修改_Pager代码如下

@model MVC3.Grid.Models.EmployeeGridModel
<div>
@{
//创建上一页链接Html.RenderPartial("_PagerLink", Model,
newViewDataDictionary {
{
"Text", "上一页"},
{
"PageIndex", Model.CurrentPageIndex -1},
{
"Selected", false},
{
"Inactive", Model.CurrentPageIndex ==1}
});
//获取第一页和最后一页var startPageIndex =Math.Max(1, Model.CurrentPageIndex -Model.PageCount /2);
var endPageIndex
=Math.Min(Model.PageCount, Model.CurrentPageIndex +Model.PageCount /2);
//添加中间的页码 如: 上一页 1 2 3 4 下一页for(var i =startPageIndex; i <=endPageIndex; i++)
{
Html.RenderPartial(
"_PagerLink", Model,
newViewDataDictionary {
{
"Text", i },
{
"PageIndex", i },
{
"Selected", i ==Model.CurrentPageIndex },
{
"Inactive", i ==Model.CurrentPageIndex }
});
}
//创建下一页Html.RenderPartial("_PagerLink", Model,
newViewDataDictionary {
{
"Text", "下一页"},
{
"PageIndex", Model.CurrentPageIndex +1},
{
"Selected", false},
{
"Inactive", Model.CurrentPageIndex ==Model.PageCount }
});
}
</div>

从上面的代码可以看出,我们的分页控件完全是由分页链接组成的,第一页和最后一页分部写了,中间的使用了遍历读取所有的分页。

给每个分页链接添加了参数,确保他们在_PagerLink中能够使用CSS及调用Action方法。

这样我们的一个简单的分页控件就做好了。下面我们要调用分页控件了。。

为Grid添加分页控件

回到我们Paged.cshtml,我们在最后的合并行添加一个分页控件,来完成我们表格的分页。

将空格改为调用_Pager即可。

<tr><td colspan="5">
@Html.Partial("_Pager", Model)
</td></tr>

运行效果

ASP.NET MVC 3.0(十六): MVC 3.0 实例系列之表格数据的分页第8张

我们点击上下页,功能已经完成。

唯一的缺憾是我们的控件,在最后一页的时候就会缺少几行,有点丑。

我们可以对他进行美化填充

Paged.cshtml完整代码:

@model MVC3.Grid.Models.EmployeeGridModel
@{
ViewBag.Title = "Paged";
Layout = "~/Views/Shared/_Layout.cshtml";
int i = 0;
}
<h2>分页列表</h2><p><i>总共有 @Model.TotalRecordCount 条记录,每页显示 @Model.PageSize 条</i><i>你正在查看的是 @Model.PageCount 页的第 @Model.CurrentPageIndex 页</i></p><table border="1"width="100%"style="text-align: center; border-collapse: collapse"><tr><th>编号</th><th>姓名</th><th>性别</th><th>生日</th><th>是否婚配</th></tr>
@foreach (var item in Model.Employees)
{
<tr><td>@item.EmployeeNO</td><td>@item.EmployName</td><td>@item.Sex</td><td>@string.Format("{0:yyyy年MM月dd日}",item.Birthday)</td><td>
@if (item.Marital == "1")
{
@:@("是")
}
@if (item.Marital != "1")
{
@:@("否")
}
</td></tr>
i++;
}
@if (i
<5)
{
while (i < Model.PageSize)
{
i++;
<tr
><td colspan="5">&nbsp</td></tr>
}
}
<tr><td colspan="5">
@Html.Partial("_Pager", Model)
</td></tr></table>

美化效果

ASP.NET MVC 3.0(十六): MVC 3.0 实例系列之表格数据的分页第9张

大功告成!!!

总结

MVC的分页控件,实际就是多个分页链接控件的组成,通过循环遍历等手段,将页数转换为分页连接,然后给每个链接指定Action的参数值,调用相应的Action操作方法,返回读取的数据集。这种方式虽然复杂,但是重用性很高,如果加以封装可以在任意程序中使用。

下节预告

下节我们将学习如何使用MVC原理来实现表格中数据的筛选

记忆逝去的青春出处:http://www.cnblogs.com/lukun/

免责声明:文章转载自《ASP.NET MVC 3.0(十六): MVC 3.0 实例系列之表格数据的分页》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇真正掌握vuex的使用方法(三)高可用rabbitmq集群服务部署步骤下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

10 款很有创意的 jQuery 表格插件

本文包含 10 款 jQuery 的表格插件,包含表格功能增强、导出、排序以及过滤等功能。 1. Animated table-sort 该插件可让你使用动画的方式对数据进行排序,在线演示: here. 2. BIGrid 该插件将增强你的表格功能,例如固定的宽度进行行列的滚动等,在线演示: here. 3. Compass Datagrid 这是基于 A...

【译】在Asp.Net中操作PDF – iTextSharp 使用表格

使用Asp.Net生成PDF最常用的元素应该是表格,表格可以帮助比如订单或者发票类型的文档更加格式化和美观。本篇文章并不会深入探讨表格,仅仅是提供一个使用iTextSharp生成表格的方法介绍,本文需要阅读我之前iTextSharp系列文章作为基础: 在ASP.NET中创建PDF-iTextSharp起步 在Asp.Net中操作PDF - iTextSha...

HTML-table

表格 创建表格的四个元素:table、tr、th、td 1、<table>…</table>:整个表格以<table>标记开始、</table>标记结束。 2、<tr>…</tr>:表格的一行,所以有几对tr 表格就有几行。 3、<td>…</td>:表格的一个...

table表单打印添加页码和自动分页

今天接到一个需求,就是打印页面需要自动分页,并且添加分页页码。 查找了很多插件或者文档都没有好的处理方法,所以准备自己写一个函数来处理。 页面样式: 要求:第一个页面添加总体的大表单,第二个页面添加小表单。并且自动分页,添加页码。table列表中如果有note字段的话,需要另起一行添加备注,如果没有则隐藏,字数最多为200字。 先说思路: 1. 可以将页...

easyui datagrid分页要点总结

easyui的datagird插件比较好用,也很方便。网上也有很多热的网友贴出了使用代码,但是很少有网友指出在使用过程应该注意的地方,让我实在搞不清分页应该怎么使用。我就说下使用分页功能中要注意的一个小地方。 1、首先你的html得有个table标签 <table id="tt" ></table> 在js页面加载代码中$(docu...

SpringBoot+Mybatis-Plus两种分页方法

用到的依赖: <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>${mybatisplus.version}&l...