在这一篇文章中,我们将学习如何在MVC页面中实现分页的方法。分页功能是一个非常实用,常用的功能,当数据量过多的时候,必然要使用分页。在今天这篇文章中,我们学习如果在MVC页面中使用PagedList.Mvc包来实现分页功能。

1) 安装PagedList.Mvc
首先,我们需要安装分页组件包,在Visual Studio 2010中点击【项目】-【管理NuGet程序包】,打开NuGet包管理器窗体,在该窗体中,选择“联机”标签,然后搜索pagedlist,如下图所示。点击“安装”按钮安装PagedList.Mvc的最新版本(目前最新版本为4.5.0)。
在把PagedList.Mvc安装完成之后,PagedList包也被安装上了。如下图。
图1:NuGet包管理器中显示的PagedList.Mvc
2) 实现带分页功能的视图实体对象和控制器
把PagedList.Mvc安装完成之后,第一件事就是增加一个视图实体对象,用来放置一些查询属性与查询结果。在Models目录下新增一个ViewBook.cs文件,代码如下列所示:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using PagedList;
namespace MvcApplication1.Models
{
public class ViewBook
{
public IPagedList<Book> Books { get; set; }
public string Search { get; set; }
public string Category { get; set; }
public string SortBy { get; set; }
}
}
我们现在需要修改BookController类的SearchIndex方法,以便Books作为PagedList返回(使用ToPagedList()方法完成)。为了使用PagedList,我们还需要设置默认排序。为了使用PagedList包,我们首先需要在该文件的顶部添加using PagedList;代码,然后修改Controllers\BookController.cs文件为下列粗体显示的代码。
public ActionResult SearchIndex(string Category, string searchString, string sortBy,int? page)
{
var cateLst = new List<string>();
var cateQry = from d in db.Books
orderby d.Category
select d.Category;
cateLst.AddRange(cateQry.Distinct());
ViewBag.category = new SelectList(cateLst);
//排序选项
var orderbyLst = new Dictionary<string, string>
{
{ "价格从低到高", "price_lowest" },
{ "价格从高到低", "price_highest" }
};
ViewBag.sortBy = new SelectList(orderbyLst, "Value", "Key");
// [2017-2-14 end]
var books = from m in db.Books
select m;
if (!String.IsNullOrEmpty(searchString))
{
books = books.Where(s => s.Name.Contains(searchString));
}
// sort the results
switch (sortBy)
{
case "price_lowest":
books = books.OrderBy(p => p.Price);
break;
case "price_highest":
books = books.OrderByDescending(p => p.Price);
break;
default:
books = books.OrderBy(p => p.Name);
break;
}
//分页
const int pageItems = 5;
int currentPage = (page ?? 1);
IPagedList<Book> pageBooks = books.ToPagedList(currentPage, pageItems);
// [2017-2-14]
ViewBook vbook = new ViewBook();
vbook.Books = pageBooks;
vbook.Category = Category;
vbook.SortBy = sortBy;
vbook.Search = searchString;
if (string.IsNullOrEmpty(Category))
vbook.Books =pageBooks;
else
{
vbook.Books =pageBooks.Where(x => x.Category == Category).ToPagedList(currentPage, pageItems);
}
return View(vbook);
}
以上代码进行了以下几次发动,第一处改动是添加了一个int? page参数,它是一个可空整型,表示用户在书籍查询页面中选择的当前页码。当第一次加载书籍查询页面时,用户还没有选择任何页码,因此,这个参数可以为null。
我们必须确保当前的分类也要保存在视图实体对象中,因此,我们添加了vbook.Category = Category;这行代码。
代码books = books.OrderBy(p => p.Name);用于对产品列表进行默认排序,这是因为PagedList要求列表必须是一个有序列表。
接着,我们使用代码const int pageItems = 5;来指定每页显示的数据数量。然后,我们声明了一个整型变量int currentPage = (page ?? 1);来保存当前页码,该变量的值是page参数的值,或者是1(当page变量为null时)。
我们使用代码vbook.Books = books.ToPagedList(currentPage, PageItems);,对产品信息调用了ToPagedList方法,并将当前页和每页显示的条目数传递给了ToPagedList方法,然后将该方法的返回值赋值给了视图实体对象的Books属性。
我们使用代码viewBook.SortBy = sortBy;将sortBy参数的值保存到视图实体对象的SortBy属性中,以便我们从一页移动到另一页时,产品的排序保持不变。
3) 带分页功能的查询页面
在视图实体对象和控制器中对实现分页功能的代码进行修改之后,现在,我们需要更新视图文件\Views\Products\SearchIndex.cshtml,在这个视图文件中显示一个分页控件,以便用户可以在各页之间移动。我们同时也添加了有多少条数据的指示信息。为了完成这些功能,我们在该文件中添加了一个using语句,一个书籍总数的指示信息以及在该页底部显示一个分页控件,具体代码如下面显示:
@model MvcApplication1.Models.ViewBook
@using PagedList.Mvc
@{
ViewBag.Title = "书籍查询";
}
<link href="/Content/PagedList.css" rel="external nofollow" rel="external nofollow" rel="stylesheet" type="text/css" />
<h2>书籍查询</h2>
@using (Html.BeginForm("SearchIndex","book",FormMethod.Get)){
<p>书籍种类: @Html.DropDownList("category", "All")
书籍名称: @Html.TextBox("SearchString")
排序: @Html.DropDownList("sortBy", "不排序")
<input type="submit" value="查询" /> </p>
}
<table>
<tr>
<th>
@Html.DisplayNameFor(model => model.Books.First().Category)
</th>
<th>
@Html.DisplayNameFor(model => model.Books.First().Name)
</th>
<th>
@Html.DisplayNameFor(model => model.Books.First().Numberofcopies)
</th>
<th>
@Html.DisplayNameFor(model => model.Books.First().AuthorID)
</th>
<th>
@Html.DisplayNameFor(model => model.Books.First().Price)
</th>
<th>
@Html.DisplayNameFor(model => model.Books.First().PublishDate)
</th>
<th></th>
</tr>
@foreach (var item in Model.Books) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.Category)
</td>
<td>
@Html.DisplayFor(modelItem => item.Name)
</td>
<td>
@Html.DisplayFor(modelItem => item.Numberofcopies)
</td>
<td>
@Html.DisplayFor(modelItem => item.AuthorID)
</td>
<td>
@Html.DisplayFor(modelItem => item.Price)
</td>
<td>
@Html.DisplayFor(modelItem => item.PublishDate)
</td>
<td>
@Html.ActionLink("Edit", "Edit", new { id=item.BookID }) |
@Html.ActionLink("Details", "Details", new { id=item.BookID }) |
@Html.ActionLink("Delete", "Delete", new { id=item.BookID })
</td>
</tr>
}
</table>
<div>
Page @(Model.Books.PageCount < Model.Books.PageNumber ? 0 : Model.Books.PageNumber) of @Model.Books.PageCount
@Html.PagedListPager(Model.Books, page => Url.Action("SearchIndex", new { category = Model.Category,
search = Model.Search, sortBy = Model.SortBy, page }))
</div>
分页链接生成代码包裹在div标签内。其中第一行代码使用?:操作符的第一行代码决定是否有任何页码显示,它显示“Page 0 of 0”或者“Page x of y”,x表示当前页码,y表示总页数。
第二行代码使用来自于PagedList.Mvc命名空间的PagedListPager辅助器。该辅助器接收一个产品列表参数,并为每个页面生成一个超链接。Url.Action用于生成一个含有当前页参数超链接目标。我们将一个匿名类型(含有当前分类、搜索条件、排序信息和分页)传递给该辅助器方法,以便每个页面的链接中都包含一个查询字符串,这个查询字符串包含有当前分类、搜索条件、排序信息和分页信息。这意味着,当从一个页面移动到另一个页面时,搜索条件、选择的分类和排序规则都被保存下来。如果没有这样做,书籍列表将会被重置为显示所有书籍信息。
在使用了上述代码后,按“价格从低到高”排序分页界面,如下图1。
图1
我们发现分页的数字部分,并不好看,原来我们缺少引用了CSS,在查询页面的标题下方添加如下代码。在上述代码中的蓝色字体。
<link href="/Content/PagedList.css" rel="external nofollow" rel="external nofollow" rel="stylesheet" type="text/css" />
再次点击“查询”按钮,然后对其结果按照“价格从低到高”进行排序,效果如下图2。
图2:有搜索条件、排序和按分类过滤的分页效果
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# ASP.NET
# MVC
# 分页
# ASP.NET MVC 5使用X.PagedList.Mvc进行分页教程(PagedList.Mvc
# MVC+jQuery.Ajax异步实现增删改查和分页
# MVC分页之MvcPager使用详解
# ASP.NET MVC分页和排序功能实现
# ASP.NET MVC5 实现分页查询的示例代码
# ASP.NET MVC4 HtmlHelper扩展类
# 实现分页功能
# Asp.net MVC 中利用jquery datatables 实现数据分页显示功能
# ASP.NET MVC4 Razor模板简易分页效果
# ASP.NET MVC+EF在服务端分页使用jqGrid以及jquery Datatables的注意
# MVC使用MvcPager实现分页效果
# 如下图
# 每页
# 给了
# 所示
# 最新版本
# 该文件
# 超链接
# 是一个
# 整型
# 还没有
# 在这个
# 将会
# 在这
# 上了
# 也要
# 当前页
# 几次
# 它是
# 有多少
相关文章:
如何通过可视化优化提升建站效果?
广东企业建站网站优化与SEO营销核心策略指南
手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?
天河区网站制作公司,广州天河区如何办理身份证?需要什么资料有预约的网站吗?
零基础网站服务器架设实战:轻量应用与域名解析配置指南
如何用IIS7快速搭建并优化网站站点?
Android自定义listview布局实现上拉加载下拉刷新功能
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
宠物网站制作html代码,有没有专门介绍宠物如何养的网站啊?
python的本地网站制作,如何创建本地站点?
弹幕视频网站制作教程下载,弹幕视频网站是什么意思?
深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?
如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?
建站之星安装后如何配置SEO及设计样式?
网站企业制作流程,用什么语言做企业网站比较好?
文字头像制作网站推荐软件,醒图能自动配文字吗?
如何在Windows虚拟主机上快速搭建网站?
如何通过远程VPS快速搭建个人网站?
制作公司内部网站有哪些,内网如何建网站?
建站之星备案流程有哪些注意事项?
如何快速启动建站代理加盟业务?
,石家庄四十八中学官网?
黑客如何通过漏洞一步步攻陷网站服务器?
简单实现Android文件上传
实惠建站价格推荐:2025年高性价比自助建站套餐解析
如何用搬瓦工VPS快速搭建个人网站?
如何高效配置香港服务器实现快速建站?
沈阳个人网站制作公司,哪个网站能考到沈阳事业编招聘的信息?
浙江网站制作公司有哪些,浙江栢塑信息技术有限公司定制网站做的怎么样?
黑客入侵网站服务器的常见手法有哪些?
惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?
,巨量百应是干嘛的?
无锡制作网站公司有哪些,无锡优八网络科技有限公司介绍?
岳西云建站教程与模板下载_一站式快速建站系统操作指南
网站制作免费,什么网站能看正片电影?
如何处理“XML格式不正确”错误 常见XML well-formed问题解决方法
如何用腾讯建站主机快速创建免费网站?
如何在腾讯云服务器快速搭建个人网站?
如何用AWS免费套餐快速搭建高效网站?
建站之星五站合一营销型网站搭建攻略,流量入口全覆盖优化指南
头像制作网站在线制作软件,dw网页背景图像怎么设置?
C++用Dijkstra(迪杰斯特拉)算法求最短路径
宝华建站服务条款解析:五站合一功能与SEO优化设置指南
唐山网站制作公司有哪些,唐山找工作哪个网站最靠谱?
如何配置WinSCP新建站点的密钥验证步骤?
Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递
广州网站建站公司选择指南:建站流程与SEO优化关键词解析
如何撰写建站申请书?关键要点有哪些?
如何快速搭建安全的FTP站点?
网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。