Lind.DDD.Paging分页模块介绍
分页组件网上有很多,MVC.Pager,JSPager等,通过实现方式大体分为前端分页和后端分页,前端分页是前台对list内存本地集合进行分页,缺点就是在大数据情况下,内存占用过高;后端分页就是UI把要返回的页号告诉后台,由后台组织数据并返回,这种方法就是我们经常看到的了;而根据后台集合种类又可以分类List和IQueryable,前者是本地集合,在返回数据时,直接把第几页共几条的集合返回;IQueryable是预查询集合,它是Linq的产物,在很多地里它不通用,除非你的ORM框架支持Linq,否则建议用List本地集合,一般来说,分页的本地集合会在底层提供一些方法,它的参数一般包含了pageIndex和pageSize,下面可以看一下大叔针对mongodb制定的分页规范
/// <summary>
/// MongoDB集成的查询方法,大数据情况下,有分页时使用这个方法
/// </summary>
/// <typeparam name="U">匿名对象,用来为条件赋值</typeparam>
/// <param name="template">条件对象</param>
/// <param name="limit"></param>
/// <param name="skip"></param>
/// <returns></returns>
PagedResult<TEntity> GetModel<U>(U template, int pageIndex, int pageSize);
而在Linq的底层,可以直接返回IQueryable集合,而在业务层进行返回Lind.DDD.Paging的分页集合即可,这块比较方便,今天主要说的是Linq下的分页方法
/// <summary>
/// 拿到可查询结果集(Linq)
/// </summary>
/// <returns></returns>
System.Linq.IQueryable<TEntity> GetModel();
LINQ环境下大叔分页的介绍
分页基类
public abstract class PageListBase<T> :
List<T>,
IEnumerable<T>,
IPagedList //繼承List<T>可以使用它的内部方法,如AddRange,Skip,Take等
{
/// <summary>
/// 初始化分页
/// </summary>
public PageListBase()
{
this.AddParameters = new NameValueCollection();
this.PageSize = ;
} /// <summary>
/// 总页数
/// </summary>
public int TotalPages { get; set; } /// <summary>
/// 总记录数
/// </summary>
public int TotalCount { get; set; } /// <summary>
/// 当前页
/// </summary>
public int PageIndex { get; set; } /// <summary>
/// 每页显示多少条记录
/// </summary>
public int PageSize { get; set; } /// <summary>
/// 是否有上一页
/// </summary>
public bool IsPreviousPage { get { return (PageIndex > ); } } /// <summary>
/// 是否有下一页
/// </summary>
public bool IsNextPage { get { return (PageIndex * PageSize) <= TotalCount; } } /// <summary>
/// 分页参数
/// </summary>
public NameValueCollection AddParameters { get; set; }
}
对于分页我们提供了传统分页和微博式(加载更多)分页,它们有自己的返回对象,看一下代码
/// <summary>
/// 分页通用类(传统分页)
/// </summary>
/// <typeparam name="T"></typeparam>
public class PagedList<T> : PageListBase<T>
{
public PagedList()
: this(null, , )
{
}
/// <summary>
/// 数据源为IQueryable的范型
/// </summary>
/// <param name="source">数据源</param>
/// <param name="index">当前页</param>
/// <param name="pageSize">每页显示多少条记录</param>
public PagedList(IQueryable<T> source, int index, int pageSize)
{
if (source != null) //判断传过来的实体集是否为空
{
int total = source.Count();
this.TotalCount = total;
this.TotalPages = total / pageSize; if (total % pageSize > )
TotalPages++; this.PageSize = pageSize;
if (index > this.TotalPages)
{
index = this.TotalPages;
}
if (index < )
{
index = ;
}
this.PageIndex = index;
this.AddRange(source.Skip((index - ) * pageSize).Take(pageSize).ToList()); //Skip是跳到第几页,Take返回多少条
}
}
}
微博式分页主要是在原有数据基础上,进行追加数据,这在Linq里相当于一个Skip(0)加Take(PageIndex*PageSize)的动作,呵呵
/// <summary>
/// 以追加的方式,显示内容,即从第1页开始显示N条记录
/// </summary>
/// <typeparam name="T"></typeparam>
public class PageListAppend<T> : PageListBase<T>
{
/// <summary>
/// 数据源为IQueryable的范型
/// </summary>
/// <param name="source">数据源</param>
/// <param name="index">当前页</param>
/// <param name="pageSize">每页显示多少条记录</param>
public PageListAppend(IQueryable<T> source, int index, int pageSize)
{
if (source != null) //判断传过来的实体集是否为空
{
int total = source.Count();
this.TotalCount = total;
this.TotalPages = total / pageSize; if (total % pageSize > )
TotalPages++; this.PageSize = pageSize;
if (index > this.TotalPages)
{
index = this.TotalPages;
}
if (index < )
{
index = ;
}
this.PageIndex = index;
this.AddRange(source.Skip().Take(index * pageSize).ToList()); //Skip是跳到第几页,Take返回多少条
}
}
}
有一点要特别注意一下,在LINQ分页时,我们看到被传入的集合一定是IQueryable的,如果是本地IList集合,那就失去了分页的意义,它相当于把所有数据加载到内存,然后再分页了。
有了数据的返回,下面再来看一下前台页面的组织,我们也封装了一个PagerHelper的方法,当然你也可以在分部页上进行设计,这都是可以的。
aaarticlea/png;base64,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" alt="" />
我们在前台调用时为大家封装了ajax分页,传统分页和微博分页等,直接在view上调用即可,当然如果你在前台对样式要求比较严格,也可以自己设计分布页来实现
@{
//分页灵活视图,根据自己项目的需要,去重写它
Layout = null;
var route = Request.RequestContext.RouteData.Values;
var controller = route["controller"].ToString();
var action = route["action"].ToString();
var currentPage = int.Parse((route["page"] ?? Request.QueryString["page"] ?? "").ToString()); var pageCount = int.Parse((route["pageCount"] ?? Request.QueryString["pageCount"] ?? "").ToString());
if (currentPage < )
{
currentPage = ;
}
if (currentPage > pageCount)
{
currentPage = pageCount;
}
}
<div>
<span>@Html.ActionLink("首页", action, controller, new { page = })</span>
<span>@Html.ActionLink("上一页", "Index", new { page = currentPage - })</span>
<span>@Html.ActionLink("下一页", "Index", new { page = currentPage + })</span>
<span>@Html.ActionLink("尾页", "Index", new { page = pageCount })</span>
<span>@currentPage/@pageCount</span>
</div>
感谢各位的耐心阅读!
Lind.DDD.Paging分页模块介绍的更多相关文章
- Lind.DDD.Repositories.Mongo层介绍
回到目录 之前已经发生了 大叔之前讲过被仓储化了的Mongodb,而在大叔开发了Lind.DDD之后,决定把这个东西再搬到本框架的仓储层来,这也是大势所趋的,毕竟mongodb是最像关系数据库的NoS ...
- Lind.DDD.Repositories.Redis层介绍
回到目录 之前已经发生了 大叔之前介绍过关于redis的文章,有缓存,队列,分布式pub/sub,数据集缓存以及仓储redis的实现等等,而今天在Lind.DDD的持久化组件里,redis当然也有一席 ...
- Lind.DDD.Repositories.EF层介绍
回到目录 Lind.DDD.Repositories.EF以下简称Repositories.EF,之所以把它从Lind.DDD中拿出来,完全出于可插拔的考虑,让大家都能休会到IoC的魅力,用到哪种方法 ...
- Lind.DDD.Authorization用户授权介绍
回到目录 Lind.DDD.Authorization是Lind.DDD框架的组成部分,之所以把它封装到框架里,原因就是它的通用性,几乎在任何一个系统中,都少不了用户授权功能,用户授权对于任何一个系统 ...
- Lind.DDD.Events领域事件介绍
回到目录 闲话多说 领域事件大叔感觉是最不好讲的一篇文章,所以拖欠了很久,但最终还是在2015年年前(阴历)把这个知识点讲一下,事件这个东西早在C#1.0时代就有了,那时学起来也是一个费劲,什么是委托 ...
- Lind.DDD敏捷领域驱动框架~介绍
回到占占推荐博客索引 最近觉得自己的框架过于复杂,在实现开发使用中有些不爽,自己的朋友们也经常和我说,框架太麻烦了,要引用的类库太多:之前架构之所以这样设计,完全出于对职责分离和代码附复用的考虑,主要 ...
- Lind.DDD.API核心技术分享
回到目录 关于Lind.DDD框架里API框架的技术点说明 讲解:张占岭 花名:仓储大叔 主要框架:Lind.DDD 目录 关于Lind.DDD.Authorization 关于授权的原理 关于Api ...
- Lind.DDD敏捷领域驱动框架~Lind.DDD各层介绍
回到目录 Lind.DDD项目主要面向敏捷,快速开发,领域驱动等,对于它的分层也是能合并的合并,比之前大叔的框架分层更粗糙一些,或者说更大胆一些,在开发人员使用上,可能会感觉更方便了,更益使用了,这就 ...
- Lind.DDD.Messaging框架通讯组件介绍
回到目录 大 家好,今天有时间来介绍一下Lind.DDD框架里的消息机制,消息发送这块一般的实现方法是将Email,SMS等集成到一个公用类库里,而本身 Email和SMS没什么关系,它们也不会有什么 ...
随机推荐
- Java ServletContextListener用法
ServletContext 被 Servlet 程序用来与 Web 容器通信.例如写日志,转发请求.每一个 Web 应用程序含有一个Context,被Web应用内的各个程序共享.因为Context可 ...
- Bootstrap~学习笔记索引
回到占占推荐博客索引 bootstrap已经用了有段时间了,感觉在使用上还是比较容易接受的,在开发人员用起来上,也还好,不用考虑它的兼容性,手机,平台,PC都可以有效的兼容. bootstrap官方a ...
- 基础才是重中之重~Emit动态构建方法(参数和返回值)
回到目录 对于Emit我们知道它的可以动态构建程序集,类型,方法,属性等,或者说只要手动使用C#创建的东西使用Emit也都可以动态创建它们,Emit由于它的特别之处,所以在很多领域得到了广泛的应用,像 ...
- Atitit.自然语言处理--摘要算法---圣经章节旧约39卷概览bible overview v2 qa1.docx
Atitit.自然语言处理--摘要算法---圣经章节旧约39卷概览bible overview v2 qa1.docx 1. 摘要算法的大概流程2 2. 旧约圣经 (39卷)2 2.1. 与古兰经的对 ...
- JMeter--二、在Windows环境上搭建wordpress
为了学习使用JMeter,在Windows环境上搭建了wordpress. 使用JMeter录制或是编写登录worepress.编辑文章.删除文章的脚本. 首先了解一下wordpress是什么? Wo ...
- angular中的compile和link函数
angular中的compile和link函数 前言 这篇文章,我们将通过一个实例来了解 Angular 的 directives (指令)是如何处理的.Angular 是如何在 HTML 中找到这些 ...
- WaitType:SOS_SCHEDULER_YIELD
今天遇到一个query,处于SOS_SCHEDULER_YIELD 状态,physical IO 不增加,CPU的使用一直在增长.当一个sql query长时间处于SOS_SCHEDULER_YIEL ...
- 在Package中处理 bit column
SQL Server没有boolean类型,使用bit 类型来代替,bit类型有两个值:0 和 1. SSIS package中有boolean类型,SSIS自动将bit 类型转换成boolean类型 ...
- jQuery 2.0.3 源码分析Sizzle引擎 - 超级匹配
声明:本文为原创文章,如需转载,请注明来源并保留原文链接Aaron,谢谢! 通过Expr.find[ type ]我们找出选择器最右边的最终seed种子合集 通过Sizzle.compile函数编译器 ...
- ajax实现上传文件
1.html部分 <input style="width: 280px" type="file" name="upLoadProjectPl ...