回到目录

分页组件网上有很多,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,iVBORw0KGgoAAAANSUhEUgAAATsAAADwCAIAAADw5lRTAAAOcUlEQVR4nO2dPc7buBZAtZ9ptZTsQLv4Km9ARYAHd6kywCtUpFKABwzibgbBax0MomKKdE6awWzgTiGJ4q8k57MlXvscuPhCUSTl6Phe0j8sBAD0UOw9AAC4AowF0ATGAmgCYwE0cTNjq0LqLijtpCykKKRqI+V+4b7cfEipa38Gfnx58/bDL28/vHzdeyQPx52NFRGRuozctTP1f45oL1fVvPmQZvq6Hd9e3n74xTzef/nrTv18/Ww3/unjhzd//D17wt/v3mPs7dnN2JvzemPvwSbG/vbuR//3PSXB2DxYMLYqpCylKIZHOxYaOc3f0Zo93l3bVkMd51Yec8jwdI+unqoVldOgefRDcspL6VbU/LkhzdRMXbsZUvSKUoUxbGMnkT59jARep/Dth18+fhORv/74LVrzzfup/OVr0tjo6SISGPvt5e1vb96b3j9/ErmidxhZNtbccObmSxkb1oz+M1WnrFeNOBW15qOZPeaVLVw1pFTNmVGZIa15ftJYxv748sayN6jg1eyd+fYyymM79unj4LMYOb9+dmx/2xsbPz32z28vk3vm0OreYWTZWHOjt9VwX6aMDWv2rLkjr5hDjgHNkyTVixdOUzVfM6SrZgSRIUWvKHGZAfY81tb173fvvXJLIRMwxyUiL6B9+hhEtmiMTZxuBuDFWD8XWN87jFxn7HyMDWv23NhYqwWTWEZ7scP+T8TYexibGpKpbF/RTKGFY4JVaG56U8F2eIxsP768iS1WXWFscq1rwdiXr9f0DiOrje2kDOTs51q+sVbNnjXGttX8bC1GJ6U1afRTU/to68fYaOD66SHN1HTaTA8pekVzhRMxY6ekV+Tr5yHG2oXO6RE91hqbOF1E5oydsvfVvcPIsrEmhTN33rQoUkldTsaGNXtMHmimbeHaj1c+M4OzqznitemVJ2uc0ZqvHNJMTe/ao0OKXlHyMn2iMdZaZPr45d37oYKzzGPOciaog9KrjY2fLiJWSJ/kjCTPK3uHkSuyYtBNoJxZ3dmE+CsLXAvGPg0mPRaZzWbvBMbeBox9KkxqGk5oN+gaY28A3wQA0ATGAmgCYwE0gbEAmsBYAE1gLIAmVhnbVkVRFMUz/pgCQF6sMLarS2QFyIN1xpZ8jAIgCzAWQBMrjG0rkmKATJg3tl9ywleAXFgXY8mKAfKAeSyAJjAWQBMYC6CJNZ95aitWnwDyYO3nirEWIAf4JgCAJjAWQBMYC6AJjAXQBMY+OOMn1uLv0XV1WSzCimNOYOxDY3/CdM03OnjvPXseyNhOymDLn4xZ8XHtri5fFeG8Lrq6XOqS72llzz7G1qW0ItJev5/dLDfdwWD4qZyB20eeSaf0j3ys/BJGtIG2iow69rb6bGaMv7mxj7FVMRi7chP0PbBtuccP56wxdiVhA1Fdp0NO7WQmzM8F5cjmxrbOvo9FMWxn3FZSWvsv9jfKtO1lMe16PG3oOG7raBf6G8AGp1eF1dHcTspOfDP/cCLveNwNx4MPTugaa7rxbM5Y06Ynl9eL33VR1p20VVFWVSpyVq0bah1j7bQYY3NkjxjbSTlaam4Ie9Pkthpib+Vu6OzvEB9shZzcXtk9fWaXdAvL2PgE0LbYrtk3H7v1HQXWxFjvSKrijFphC8GFYKwq9jC2nQKjdacEi0adlG407itMWrZ+kHSMdSfJXT29CphOl4yNzmLtONeXW3e20TCYHFZtKmyvN3Zq1tVuRq1w8QljdbO1sX5OO25AHjc2lrXO7JvuG2udbsft1cZG46q5iaN2jgejk8PXG2uVW02tX7paMtZPlzE2O3aIsSbcDSvGIhI11s1gx5P9TNgmzIpDOV9lrH0Pm8Wd+I2dWpUd2myrhXls0N/MkdTbNtEVqbSDfTNt//rD27KZso+xZko5b6y3TNWOp9uF/Y1lB15TaJ8enbteH2OtXLmqTWyKrie5i0LVOPhyrNQmTo+sWxWxVNsZ3NSXEy79C0h+Z7I/364elkAWaPsERZDr3vYd3Z/BVTuLLxK7tsaydqtipNg5vvvVgI1CY90guf/95OjBLQ73RZuxIiJSJVae9iP67inA7VFpLMDTgrEAmsBYAE1gLIAmMBZAExgLoAmMBdAExgJoAmMBNIGxAJrAWABNYCyAJjAWQBMYC6AJjAXQBMYCaAJjATSBsQCawFgATRTfv/+z5aMoioMeNn5yePBYfOxg7O7XvPKBsTwyfGydFReFmjz8cDjsPQQAH4xNgrGQIQ9o7Lk5HE8XkcvpeDxd/KOX03F5/tqcBWMhSx7O2NHX4e/mvFA/7rUIxkKW5Gfs5XQ8HBISLWL7OrS10FTaaoyFDNnN2CE7jdiSjnoLnJuI6ucm7GQ2MzaVMRYyZC9jL6fjoTmdjstp60qiuk6HnH6SrwkXe0AYCxmyk7GDGrYhTuAz2pwbK/z1mp0b86f5+9wcjk2TipzN2Q21jrF2WoyxkDv7GGvMuESibKxMJFhTOjTnWMbrnx6LpxgLatnFWEuMiHShcl6QNSdG0+Bw8Qlj4XHYw9hg4cdV1tbGFtpRcciWQ2U9YReN9dNljIWs2cFYL4YGUdY67ss7ejacczkd0+dOzacXt/p3f879K4gvNsZChuxgrC9VJCrGVp6a0xAZnVVhex04tlwcnepODdvV/RKMhQzJ7xMUyZWnWVxb7bzba2p8CUj1MCmOsZAh2Xzb7s//tb//8/37P3+2/zkc/vv73t9p+s637Xhk+dja2BkNfv/1cDgcDr/+f/cnZXGoPHjs9dg6K05/OjBHNn5yABZR821VABCMBdAFxgJoAmMBNIGxAJrAWABNYCyAJjAWQBMYC6AJjAXQBMYCaAJjATSBsQCawFgATWAsgCYwFkATGAugCX6DYo6NnxyARXYwduMefxpFQ4XnAWOTKBoqPA8Ym0TRUOF5eEBjxz0G4rvEzu72PNKctxkqwLU8nLHenpWLmwukd4THWMgQncaOgTLwMdyKMrVxu3VGwmqMhQzZw1hXK+tfV+24E93GLvQztlXWbGbMbpSQMw9jbFTX6ZDTbjITZv9YyJ1cjJ12nRw4ni5yOR2Px35v16bx93j1N60cq8TDpr+xM3u0g052Mja0UySMseM0dNrgOWWsuCdZ5Ut7tGMsqCKXGCsicWObs5FqnbHh4hPGwuPwcMZGdnyfNdZPlzEWsiY7Y/03Z64zNrqAnF7M6js8n/w5shkqQGZkZaxYU9xh5WneWGcWHF0ujr25Y/VkV/dLMBYyROcnKEJcW+03XD1fx9eEVOCdFMdYyJBHMfYOKBoqPA8Ym0TRUOF54Dco5tj4yQFYhN95AtAExgJoAmMBNIGxAJrAWABNYCyAJjAWQBMYC6AJjAXQBMYCaAJjATSBsQCawFgATWAsgCYwFkATGAugCYwF0ATGAmgCYwE0gbEAmsBYAE1gLIAmdBtbFVJ3N2qrk7KQqr1RawD3YR9j61JaEWmlqF7Vzi2NvXVrAPdgH2OrYjC2rF/bDo7BU7G5sa0UhfsopRPpar9ERKpCytIvdGqOxraVVXNMbqNttpXbe+UU2lmxU3N2SACbsUeM7aQspRNpq8mQIeqKiEhdDuVV4VSou2G2aWpWlrEmwW6rIXSn2hzCstuUXSc8OjckgA3Zw9h2imy2PHbo8+0yf7dOZLON9ReNEm1OWrZ+kHSMdefYXT29CvhDAtiQrY31k9JCynqKuh6vNTbWZm0lz21wyDHWOt2O2xgLO7JDjDXxalgxFhE32xSr0Nejk9LOhGeMjbYZZMI2YVYcyomxsC/7GGuS3kked0WqL4/qYdaTylrqcs7YaJvRhSs78JpC+/To3BVjYXt0f4LiaoJc95VvCANszPMZ6wZJPuQEungyY0VEpEqsPAHkzzMaC6AXjAXQBMYCaAJjATSBsQCawFgATWAsgCYwFkATGAugCYwF0ATGAmgCYwE0gbEAmsBYAE1gLIAmMBZAExgLoAmMBdAExgJoYmtjD/A6Nv7/gtzYwdiNe3wkePYAYzXBswcYqwmePcDYLTg3h+PpInI5HY+ni3/0cjouz1+bszzrswc2GHt/Rl+Hv5vzQv241yLP+eyBC8beHFvQ8J+X0/GQ8NE6I2H1Ezx7sMAuxp4bO99buH9fy5BzLka2m+GF1PD6zk04nNnM2FTGWNjLWHMbX07Hu9p0OR0PzenOnTiYq4vqauq41iYzYef5wVjY3Vj3Bg8CrxuOh7vcCUhWzePx6FY0N7x930crps/2O3Jrjr27MfJ4usi5ORybJhU5m7Mbah1j7bQYY8Fhb2Pj0zrbYrumsStyQ9sCmNPMYevGtyua4lRh2FGsH0crb+IqQR4Ri6cYC+vYfR7rr8q45a5oU1kYd6PrNVFPoxE+VhjvyJumJs+2CBefMBZ+kr1j7EQyRnqZamrKFzF2WTlzVqww3tH1xvoFS8b66TLGwkQ2xnozzUi2aYittcaM9c4eT4vm5KnCsKOYsVZuf24iiYPbyOx7sn1T5/61xn+WMBayMdbOlZuTiTjhio5bdYq9gQeBKkO3sZPjhdHimLHWOI+nsxcu/UuNv+CYzrz3cp0SjIW8P0Hhqp281a8jlZPf+n1h19ZYfm9VjBQ7x/tjGAvZG3uIT+9ewVbG3gGMhbyNFbES01t9BAJjQTH8BoUyNv7/gtzgd54ANIGxAJrAWABNYCyAJjAWQBMYC6AJjAXQBMYCaAJjATSBsQCawFgATWAsgCYwFkATGAugCYwF0ATGAmgCYwE0gbEAmsBYAE1gLIAmMBZAExgLoIkFY7u6LIqiKOtum+EAwCxrYmxXl0XV3n0oALDIqqy4rTAWIAswFkATq4wlLQbIhJVrxf0KFAtQADtDVgygCYwF0ATGAmgCYwE0scLYri5ZcwLIgxWfUsRWgGzgmwAAmsBYAE1gLIAmMBZAExgLoAmMBdAExgJo4l/tpbW/vXhlaQAAAABJRU5ErkJggg==" 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分页模块介绍的更多相关文章

  1. Lind.DDD.Repositories.Mongo层介绍

    回到目录 之前已经发生了 大叔之前讲过被仓储化了的Mongodb,而在大叔开发了Lind.DDD之后,决定把这个东西再搬到本框架的仓储层来,这也是大势所趋的,毕竟mongodb是最像关系数据库的NoS ...

  2. Lind.DDD.Repositories.Redis层介绍

    回到目录 之前已经发生了 大叔之前介绍过关于redis的文章,有缓存,队列,分布式pub/sub,数据集缓存以及仓储redis的实现等等,而今天在Lind.DDD的持久化组件里,redis当然也有一席 ...

  3. Lind.DDD.Repositories.EF层介绍

    回到目录 Lind.DDD.Repositories.EF以下简称Repositories.EF,之所以把它从Lind.DDD中拿出来,完全出于可插拔的考虑,让大家都能休会到IoC的魅力,用到哪种方法 ...

  4. Lind.DDD.Authorization用户授权介绍

    回到目录 Lind.DDD.Authorization是Lind.DDD框架的组成部分,之所以把它封装到框架里,原因就是它的通用性,几乎在任何一个系统中,都少不了用户授权功能,用户授权对于任何一个系统 ...

  5. Lind.DDD.Events领域事件介绍

    回到目录 闲话多说 领域事件大叔感觉是最不好讲的一篇文章,所以拖欠了很久,但最终还是在2015年年前(阴历)把这个知识点讲一下,事件这个东西早在C#1.0时代就有了,那时学起来也是一个费劲,什么是委托 ...

  6. Lind.DDD敏捷领域驱动框架~介绍

    回到占占推荐博客索引 最近觉得自己的框架过于复杂,在实现开发使用中有些不爽,自己的朋友们也经常和我说,框架太麻烦了,要引用的类库太多:之前架构之所以这样设计,完全出于对职责分离和代码附复用的考虑,主要 ...

  7. Lind.DDD.API核心技术分享

    回到目录 关于Lind.DDD框架里API框架的技术点说明 讲解:张占岭 花名:仓储大叔 主要框架:Lind.DDD 目录 关于Lind.DDD.Authorization 关于授权的原理 关于Api ...

  8. Lind.DDD敏捷领域驱动框架~Lind.DDD各层介绍

    回到目录 Lind.DDD项目主要面向敏捷,快速开发,领域驱动等,对于它的分层也是能合并的合并,比之前大叔的框架分层更粗糙一些,或者说更大胆一些,在开发人员使用上,可能会感觉更方便了,更益使用了,这就 ...

  9. Lind.DDD.Messaging框架通讯组件介绍

    回到目录 大 家好,今天有时间来介绍一下Lind.DDD框架里的消息机制,消息发送这块一般的实现方法是将Email,SMS等集成到一个公用类库里,而本身 Email和SMS没什么关系,它们也不会有什么 ...

随机推荐

  1. linux split 及优化

    split 虽然不好用, 但是还是可以用一下的! 有两个方式拆分, 按固定的行数, 按固定的大小. 默认是 1000 行, 后缀长度为2, 后缀长度N是说, 分片从N个字母/数字 的最小值 到 其最大 ...

  2. 将数据从MySQL迁移到Oracle的注意事项

    将数据从MySQL迁移到Oracle的注意事项1.自动增长的数据类型处理MYSQL有自动增长的数据类型,插入记录时不用操作此字段,会自动获得数据值.ORACLE没有自动增长的数据类型,需要建立一个自动 ...

  3. android/java 根据当前时间判断股票交易状态(未开盘 交易中 休市中 已收盘)

    /** * @param data yyyy-MM-dd HH:mm:ss 时间 * @return 未开盘 交易中 休市中 已收盘 */ public static String getSotckS ...

  4. 解密jQuery内核 DOM操作方法(二)html,text,val

    回顾下几组DOM插入有关的方法 innerHTML 设置或获取位于对象起始和结束标签内的 HTML outerHTML 设置或获取对象及其内容的 HTML 形式 看图对照区别 innerText 设置 ...

  5. Visulalize Boost Voronoi in OpenSceneGraph

    Visulalize Boost Voronoi in OpenSceneGraph eryar@163.com Abstract. One of the important features of ...

  6. Python标准模块--linecache

    1.模块简介 linecache主要用于缓存文件内容,如果下次继续读取该文件,则不需要打开文件,直接在缓存中获取该文件内容. 2.模块使用 模块的基本方法有getline,clearcache,get ...

  7. ASP.NET MVC之路由特性以及母版页呈现方式(十二)

    前言 这一节我们开始讲讲基础的东西也就是如题目所言,个人觉得当学习或者利用MVC时,必须得知道最新迭代版本新增了什么,至少得知道MVC 3.MVC 4或者MVC 5有什么区别,而不至于当利用到低版本时 ...

  8. lambda表达式之进化

    前言 在C#我们可以自定义委托,但是C#为什么还要内置泛型委托呢?因为我们常常要使用委托,如果系统内置了一些你可能会用到的委托,那么就省去了定义委托,然后实例化委托的步骤,这样一来既使代码看起来简洁而 ...

  9. Oracle_多表查询

    SQL多表查询 等值和不等值连接查询 从多个表中获取数据:如果在查询的时候,直接从多个表中获取数据.没有添加条件判断,会出现"笛卡尔积"错误 笛卡尔积错误 笛卡尔集会在下面条件下产 ...

  10. AspNetPager分页控件配置

    AspNetPager是asp.net中常用的分页控件,下载AspNetPager.dll,添加引用,在工具栏就可以看到AspNetPager控件: 拖过来之后,设置如下属性: <webdiye ...