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没什么关系,它们也不会有什么 ...
随机推荐
- Spring学习记录(二)---容器和bean属性配置
下载spring包,在eclipse搭建spring环境. 这步我在eclipse中无法导入包,看网上的: http://sishuok.(和谐)com/forum/blogPost/list/242 ...
- Python学习路径及练手项目合集
Python学习路径及练手项目合集 https://zhuanlan.zhihu.com/p/23561159
- 谈谈php里的IOC控制反转,DI依赖注入
理论 发现问题 在深入细节之前,需要确保我们理解"IOC控制反转"和"DI依赖注入"是什么,能够解决什么问题,这些在维基百科中有非常清晰的说明. 控制反转(In ...
- [汇编与C语言关系]4. 结构体和联合体
用反汇编的方法研究一下C语言的结构体: #include <stdio.h> int main(int argc, char ** argv) { struct { char a; sho ...
- JS验证控件jQuery Validate
jQuery Validate 插件为表单提供了强大的验证功能,让客户端表单验证变得更简单,同时提供了大量的定制选项,满足应用程序各种需求.该插件捆绑了一套有用的验证方法,包括 URL 和电子邮件验证 ...
- 在web上逐行输出较大的txt文件
在某些场景下,需要在web上展示一些日志文件,这些日志文件是放在文件服务器上的一些txt. 当日志文件很大时,下载日志会导致页面长时间卡住,一直在loading状态,而且下载完日志之后分析日志并生成d ...
- mysql表名查询sql
select table_schema,table_name,engine from information_schema.tables where table_schema not in('info ...
- 趣谈unicode,ansi,utf-8,unicode big endian这些编码有什么区别(转载)
从头讲讲编码的故事.那么就让我们找个草堆坐下,先抽口烟,看看夜晚天空上的银河,然后想一想要从哪里开始讲起.嗯,也许这样开始比较好…… 很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同 ...
- POST方式提交表单时,后台接受实体如果继承了父类,将无法映射表单对应数据
引言 刚才在做一个post提交表单时,我在表单里放了几个隐藏域用来存放数据,表单name属性和后台实体属性签名保持一致.只是后台Action参数包含继承关系,所以无法获取到表单对应的值.刚开始一直纳闷 ...
- wordpress上传图片时重命名--修改插件时遇到的一些问题
wordpress是用php语言开发的博客平台,它扩展性强,容易扩展,很适合拿来做二次开发. 1,问题由来 本周五,我在浏览公司的网站(基于wordpress开发)时发现,网站首页上有两篇文章的缩略图 ...