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没什么关系,它们也不会有什么 ...
随机推荐
- MySQL数据库数据存放位置修改
MySQL数据库数据存放位置修改 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品.MySQL 最流行的关系型数据库管理系统,在 WEB 应用方 ...
- struts tags
HTTP ERROR 500 Problem accessing /showognl.jsp. Reason: Server Error Caused by: org.apache.jasper.Ja ...
- Android开发学习之路-Android6.0运行时权限
在Android6.0以后开始,对于部分敏感的“危险”权限,需要在应用运行时向用户申请,只有用户允许的情况下这个权限才会被授予给应用.这对于用户来说,无疑是一个提升安全性的做法.那么对于开发者,应该怎 ...
- WPF入门教程系列二十——ListView示例(二)
第四步.WPF后台逻辑代码编写 在后台用Entity Framework 6.1的Code First方式获取数据库中的数据.同时,在“刷新”按钮的方法中进行数据绑定.操作步骤如下: 1) 在“刷新 ...
- PHP扩展-扩展的生成和编译
首先说明一下,PHP扩展有两种编译方式:方式一:在编译PHP时直接将扩展编译进去方式二:扩展被编译成.so文件,在php.ini里配置加载路径: 以下开始说明创建PHP扩展并编译的步骤:下载PHP源码 ...
- Web API接口之FileReader
Web API接口之FileReader *:first-child { margin-top: 0 !important; } body>*:last-child { margin-botto ...
- 支持向量机原理(四)SMO算法原理
支持向量机原理(一) 线性支持向量机 支持向量机原理(二) 线性支持向量机的软间隔最大化模型 支持向量机原理(三)线性不可分支持向量机与核函数 支持向量机原理(四)SMO算法原理 支持向量机原理(五) ...
- 使用nginx解决跨域问题(flask为例)
背景 我们单位的架构是在api和js之间架构一个中间层(python编写),以实现后端渲染,登录状态判定,跨域转发api等功能.但是这样一个中间会使前端工程师的工作量乘上两倍,原本js可以直接ajax ...
- ubuntu安装虚拟磁带库mhvtl
项目需要用到磁带库,先装个虚拟磁带库mhvtl来模拟下. 1 下载源码 从网站https://sites.google.com/site/linuxvtl2/home#mhvtl-download下载 ...
- 关于Repository、IUnitOfWork 在领域层和应用服务层之间的代码分布与实现
本来早就准备总结一下关于Repository.IUnitOfWork之间的联系以及在各层中的分布,直到看到田园里的蟋蟀发表的文章:<DDD 领域驱动设计-谈谈 Repository.IUnitO ...