前言

小伙伴们,
大家好,我是Rector。
最近Rector忙于换工作,没有太多时间来更新我们的ASP.NET MVC 5系列文章 [一步一步创建ASP.NET MVC5程序Repository+Autofac+Automapper+SqlSugar],直到现在才挤些时间赶紧更新一篇,小伙伴们等得太久了。

写系列文章是一件并不容易的事情,相信有过写系列文章经验朋友也应该有所体会。

本文知识要点

本期是该系列的第十一篇,上一篇《一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](十)》我们了解了母版页和部分视图,并使用母版页和部分视图重新组织了页面的共用区域的HTML代码,本文我们将要涉及到的内容为:

  • 通用分页的封装
  • 文章分页的实现

通用分页的封装

在之前两期中,我们的文章列表页面是没有分页功能的,而是使用如下方法:

public IEnumerable<Post> FindHomePagePosts(int limit = 20){using (var db = DbFactory.GetSqlSugarClient()){var list = db.Queryable<Post>().OrderBy(x => x.Id, OrderByType.Desc).Take(limit).ToList();return list;}}

来读取文章表中的前N(20)条记录作为首页的文章列表数据源。那么,本文将为大家封装一个通用的分页信息类以及分页泛型方法,并最终实现首页文章列表的数据分页功能。分页效果如下图:

创建IPagedList接口及实现

打开项目TsBlog.Repositories,在此项目中分别新建两个类:IPagedList.csPagedList.cs,代码分别如下:

IPagedList.cs

using System.Collections.Generic;namespace TsBlog.Repositories
{public interface IPagedList<T> : IList<T>{int PageIndex { get; }int PageSize { get; }int TotalCount { get; }int TotalPages { get; }bool HasPreviousPage { get; }bool HasNextPage { get; }}
}

IPagedLIst.cs

using System;
using System.Collections.Generic;
using System.Linq;namespace TsBlog.Repositories
{/// <summary>/// 分页组件实体类/// </summary>/// <typeparam name="T">泛型实体</typeparam>[Serializable]public class PagedList<T> : List<T>, IPagedList<T>{/// <summary>/// 构造函数/// </summary>/// <param name="source">数据源</param>/// <param name="pageIndex">分页索引</param>/// <param name="pageSize">分页大小</param>public PagedList(IQueryable<T> source, int pageIndex, int pageSize){var total = source.Count();TotalCount = total;TotalPages = total / pageSize;if (total % pageSize > 0)TotalPages++;PageSize = pageSize;PageIndex = pageIndex;AddRange(source.Skip(pageIndex * pageSize).Take(pageSize).ToList());}/// <summary>/// 构造函数/// </summary>/// <param name="source">数据源</param>/// <param name="pageIndex">分页索引</param>/// <param name="pageSize">分页大小</param>public PagedList(IList<T> source, int pageIndex, int pageSize){TotalCount = source.Count();TotalPages = TotalCount / pageSize;if (TotalCount % pageSize > 0)TotalPages++;PageSize = pageSize;PageIndex = pageIndex;AddRange(source.Skip(pageIndex * pageSize).Take(pageSize).ToList());}/// <summary>/// 构造函数/// </summary>/// <param name="source">数据源</param>/// <param name="pageIndex">分页索引</param>/// <param name="pageSize">分页大小</param>/// <param name="totalCount">总记录数</param>public PagedList(IEnumerable<T> source, int pageIndex, int pageSize, int totalCount){TotalCount = totalCount;TotalPages = TotalCount / pageSize;if (TotalCount % pageSize > 0)TotalPages++;PageSize = pageSize;PageIndex = pageIndex;AddRange(source);}/// <summary>/// 分页索引/// </summary>public int PageIndex { get; }/// <summary>/// 分页大小/// </summary>public int PageSize { get; private set; }/// <summary>/// 总记录数/// </summary>public int TotalCount { get; }/// <summary>/// 总页数/// </summary>public int TotalPages { get; }/// <summary>/// 是否有上一页/// </summary>public bool HasPreviousPage{get { return (PageIndex > 0); }}/// <summary>/// 是否有下一页/// </summary>public bool HasNextPage{get { return (PageIndex + 1 < TotalPages); }}}
}

其中,IPagedList.cs为一个分页信息接口,包含了分页的基本信息,如:当前页索引(PageIndex),分页大小(PageSize),总记录数(TotalCount),总页数(TotalPages)等等。而PagedList.cs类文件则是对IPagedList.cs接口的实现。

添加泛型仓储分页接口

打开项目TsBlog.RepositoriesIRepository.cs 文件,在其中新建分页接口,如下:

/// <summary>
/// 根据条件查询分页数据
/// </summary>
/// <param name="predicate"></param>
/// <param name="orderBy"></param>
/// <param name="pageIndex">当前页面索引</param>
/// <param name="pageSize">分布大小</param>
/// <returns></returns>
IPagedList<T> FindPagedList(Expression<Func<T, bool>> predicate, string orderBy = "", int pageIndex = 1, int pageSize = 20);

再打开此项目中的 GenericRepository.cs 泛型仓储实现类,在其中实现FindPagedList这个分页方法,如下:

/// <summary>
/// 根据条件查询分页数据
/// </summary>
/// <param name="predicate"></param>
/// <param name="orderBy"></param>
/// <param name="pageIndex">当前页面索引</param>
/// <param name="pageSize">分布大小</param>
/// <returns></returns>
public IPagedList<T> FindPagedList(Expression<Func<T, bool>> predicate, string orderBy = "", int pageIndex = 1, int pageSize = 20)
{using (var db = DbFactory.GetSqlSugarClient()){var totalCount = 0;var page = db.Queryable<T>().OrderBy(orderBy).ToPageList(pageIndex, pageSize, ref totalCount);var list = new PagedList<T>(page, pageIndex, pageSize, totalCount);return list;}
}

类似地操作,打开项目 TsBlog.Services,并打开文件 IService.cs,在其中添加分页服务接口,如下:

/// <summary>
/// 根据条件查询分页数据
/// </summary>
/// <param name="predicate"></param>
/// <param name="orderBy"></param>
/// <param name="pageIndex">当前页面索引</param>
/// <param name="pageSize">分布大小</param>
/// <returns></returns>
IPagedList<T> FindPagedList(Expression<Func<T, bool>> predicate, string orderBy = "", int pageIndex = 1, int pageSize = 20);

再打开此项目中的泛型服务类GenericService.cs,在其中实现分页服务接口,如下:

/// <summary>
/// 根据条件查询分页数据
/// </summary>
/// <param name="predicate"></param>
/// <param name="orderBy"></param>
/// <param name="pageIndex">当前页面索引</param>
/// <param name="pageSize">分布大小</param>
/// <returns></returns>
public IPagedList<T> FindPagedList(Expression<Func<T, bool>> predicate, string orderBy = "", int pageIndex = 1, int pageSize = 20)
{return _repository.FindPagedList(predicate, orderBy, pageIndex, pageSize);
}

到此,我们的泛型仓储和服务的通用分页接口和实现就封装完成了,现在我们需要使用以上的分页封装,在UI层来实现文章列表的分页功能。

切换到项目 TsBlog.Frontend

安装第三方分页组件

为了方便,本示例教程使用的是第三方的分页组件来实现UI层的分页功能,组件为:PagedList。安装的方式为:nuget,所以与以前几期的nuget包安装类似,打开nuget包管理工具,搜索关键词PagedList,在查询出来的包中,选择PagedList.MvcPagedList两个分页组件包并安装,如下:

分页组件安装完成之后,我们再打开 HomeController 控制器,修改Index这个ActionHomerController.cs修改后的完整代码如下:

using PagedList;
using System.Linq;
using System.Web.Mvc;
using TsBlog.AutoMapperConfig;
using TsBlog.Frontend.Extensions;
using TsBlog.Services;
using TsBlog.ViewModel.Post;namespace TsBlog.Frontend.Controllers
{public class HomeController : Controller{/// <summary>/// 文章服务接口/// </summary>private readonly IPostService _postService;public HomeController(IPostService postService){_postService = postService;}/// <summary>/// 首页/// </summary>/// <returns></returns>public ActionResult Index(int? page){//var list = _postService.FindHomePagePosts();//读取分页数据,返回IPagedList<Post>page = page ?? 0;var list = _postService.FindPagedList(x => !x.IsDeleted && x.AllowShow, pageIndex: (int)page, pageSize: 10);var model = list.Select(x => x.ToModel().FormatPostViewModel());ViewBag.Pagination = new StaticPagedList<PostViewModel>(model, list.PageIndex, list.PageSize, list.TotalCount);return View(model);}}
}

最后,再打开Index对应的视图文件:/Views/Home/Index.cshtml,添加分页控件,如下:

@using PagedList
@using PagedList.Mvc
@model IEnumerable<TsBlog.ViewModel.Post.PostViewModel>
@{Layout = "~/Views/Shared/_Layout.cshtml";ViewBag.Title = "ASP.NET MVC 5 系列文章教程--首页";
}
<div class="jumbotron"><h1>小伙伴,你好</h1><p>欢迎来到 Rector 的ASP.NET MVC 5 系列文章教程。在这里,Rector将和你一起一步一步创建一个集成Repository+Autofac+Automapper+SqlSugar的WEB应用程序。</p><p>你准备好了吗?</p><p>......</p><p>让我们开始ASP.NET MVC 5 应用程序的探索之旅吧!!!</p>
</div>
<strong class="post-title">文章列表(@(Model.Count())篇)</strong>
<ul class="list-unstyled post-item-box">@foreach (var p in Model){<li><h2><a href="~/post/details/@p.Id">@p.Title</a></h2><p class="post-item-summary">@p.Summary ... <a href="~/post/details/@p.Id">阅读全文</a></p></li>}
</ul>
@Html.PagedListPager((IPagedList)ViewBag.Pagination, page => Url.Action("index", new { page }), new PagedListRenderOptions
{LinkToFirstPageFormat = "首页",LinkToPreviousPageFormat = "上一页",LinkToNextPageFormat = "下一页",LinkToLastPageFormat = "末页",DisplayLinkToFirstPage = PagedListDisplayMode.IfNeeded,DisplayLinkToLastPage = PagedListDisplayMode.Never,DisplayEllipsesWhenNotShowingAllPageNumbers = true,MaximumPageNumbersToDisplay = 5
})

以上所有更改完成后,就完成了我们对通用分页的封装和实现,当然,这个通用分页是非常简单的,只能满足单表数据的分页查询和读取。更复杂的分页需求请自行根据思路进行实现。

完成以上步骤之后,我们重新编译和生成项目 TsBlog.Frontend 。最后,在浏览器中打开地址: http://localhost:54739/ ,检查一下,数据分页功能是否起作用了呢?

好了,如果你喜欢Rector,或者是喜欢本系列文章,请为我点个赞,以鼓励Rectro继续写出更好的文章,或者系列文章。

本期源码托管地址:请至首发地址《一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](十一)》查看

看完教程如果觉得还不过瘾的,想“勾对”的,欢迎加入码友网官方QQ群:483350228,如果你按照教程还原出来的程序运行有问题,请参照本期源码对应调整与修改遇到问题的,也欢迎加入QQ群。有什么,你懂的。。。^_^

谢谢你的耐心阅读,本系列未完待续,我们下期再见……

同时,也欢迎大家关注我们的.NET编程爱好者社区:https://codedefault.com 每天都有.NET的开发技术干货更新哦。

[https://codedefault.com] 一个.NET编程爱好者社区,专注.NET/C#开发,帮助你找到疑难问题的更优美、更高级的解决方案

一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](十一)相关推荐

  1. 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](三)

    前言 上一篇<一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](二)>我们通过如下操作: 创建实体及工具类 创建Re ...

  2. 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](五)

    前言 Hi,大家好,我是Rector 时间飞逝,一个星期又过去了,今天还是星期五,Rector在图享网继续跟大家分享系列文本:一步一步创建ASP.NET MVC5程序[Repository+Autof ...

  3. 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](四)

    前言 上一篇<一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](三)>,我们完成了: * 引用SqlSugar * ...

  4. 如何从多个项目创建 ASP.NET 应用程序以进行组开发

    开发大型网站经常会涉及多个开发人员.这些开发人员必须能够在互不干扰的情况下开发 Web 应用程序的特定部分,同时仍能够在项目过程中与他人相互协作.为此,您可以在 Visual Studio .NET ...

  5. ASP.NET MVC5(一):ASP.NET MVC概览

    ASP.NET MVC概览 ASP.NET MVC是一种构建Web应用程序的框架,它将一般的MVC(Model-View-Controller)模式应用于ASP.NET框架. ASP.NET MVC模 ...

  6. 一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序 - 强烈推荐!!!

    一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序 本文根据<Professional ASP.NET MVC 1.0>中微软牛人Scott Guthrie 提供 ...

  7. 超级简单:一步一步教你创建一小型的asp.net mvc 应用程序

    超级简单:一步一步教你创建一小型的asp.net mvc 应用程序 这本教程中将帮助你创建一个小型的asp.net mvc示例. 在本教程中,我们将创建自己的 Model , View 和Contro ...

  8. 一步一步SharePoint 2007之十二:实现Form认证(2)——创建添加管理帐户的工程

    摘要 本篇文章将记录实现Form认证的第二部分--创建添加管理帐户的工程.为了完成本部分的操作,希望您已经安装了Microsoft Visual Studio 2005:) 之所以要创建添加管理帐户的 ...

  9. (转)一步一步Asp.Net MVC系列_权限管理设计起始篇

    原文地址:http://www.cnblogs.com/mysweet/archive/2012/07/26/2610793.html 前一段时间,写了一步一步asp.net的一系列博客,最近,也快要 ...

  10. (转)一步一步Asp.Net MVC系列_权限管理之权限控制

    原文地址:http://www.cnblogs.com/mysweet/archive/2012/08/05/2623687.html 在权限管理中一个很重要的就是关于权限的拦截验证问题,特别是我们在 ...

最新文章

  1. nodejs操作sqlserver数据_pyspark操作MySQL、SQLServer数据库进行数据处理操作
  2. 黄聪:主目录安装Wordpress,根目录安装Discus,httpd.ini如何写?
  3. 【双100%解法】剑指 Offer 22. 链表中倒数第k个节点
  4. 关于runc漏洞CVE-2019-5736的修复公告
  5. 发现kafka丢消息后的排查
  6. Shell 脚本调用另一个脚本的三种方法
  7. javaee字符缓冲输出流
  8. 后缀mcp用什么软件打开_如何打开MCP文件?
  9. 版本名称SNAPSHOT、alpha、beta、release、GA含义
  10. Lebesgue可测函数
  11. VMware Workstation中部署VMware vSphere 7.0
  12. day23 Java8新特性
  13. Darknet框架的权重文件.weights类型转换为keras框架的权重文件类型.h5
  14. 获取视频旋转角度,并对视频进行旋转
  15. Scons编译IMGUI
  16. Combining Sketch and Tone for Pencil Drawing Production 论文阅读(1)
  17. 【数据库篇】MySQL InnoDB ibd 文件格式解析
  18. phpstorm学习
  19. linux electron-**r 打开正常,配置正常,却用不了
  20. 【Android】在res中的图片下载导入到手机相册中的实现

热门文章

  1. java 任务链模式,flink部署运行架构
  2. 深度神经网络的正则化
  3. R-squared与Adjust R-squared
  4. python3.8下载request_python3 requests 安装包下载安装[windows]
  5. 机器学习-KMeans聚类 K值以及初始类簇中心点的选取
  6. hadoop2.7.3+hbase1.2.5配合起来使用的一个小问题,备注一下
  7. 2016-05-25 margin-right jsp获取页面流变量 文字颜色
  8. Raki的读paper小记:RoBERTa: A Robustly Optimized BERT Pretraining Approach
  9. 引入log4j日志包为何会自动导入额外两个包(门面模式)
  10. 283.移动零 (力扣leetcode) 博主可答疑该问题