Mvc Linq 分页 参考PagedList

  第一次写博客 写的不好各位大神多多包涵。

  我的分页主要是针对Linq 分页来写的,针对IEnumerable<T>  和 IQueryable<T> 类型数据分页。 开始上代码

  创建接口:

public interface IPagedList
    {
        /// <summary>
        /// 总记录数
        /// </summary>
        int TotalCount { get; set; }

        /// <summary>
        /// 总页数
        /// </summary>
        int TotalPages { get; set; }

        /// <summary>
        /// 当前页
        /// </summary>
        int PageIndex { get; set; }

        /// <summary>
        /// 页面大小
        /// </summary>
        int PageSize { get; set; }

        /// <summary>
        /// 是否上一页
        /// </summary>
        bool IsPreviousPage { get; }

        /// <summary>
        /// 是否下一页
        /// </summary>
        bool IsNextPage { get; }
    }

泛型实体类:PagedQueryableToListModel<T>(实现IQueryable集合的数据),PagedCacheToListModel<T> (实现List集合的数据)我在这里重载构造函数实现根据参数不同调用不同构造函数 代码如下:

  1 //PagedQueryableToListModel<T>泛型类
  2 public class PagedQueryableToListModel<T> : List<T>,IPagedList
  3     {
  4         /// <summary>
  5         /// 数据源为IQueryable的范型
  6         /// </summary>
  7         /// <param name="source">数据源</param>
  8         /// <param name="index">当前页</param>
  9         /// <param name="pageSize">页大小</param>
 10         public PagedQueryableToListModel(IQueryable<T> source, int index, int pageSize)
 11         {
 12             //判断传过来的实体集是否为空
 13             if(source != null)
 14             {
 15                 int total = source.Count();
 16                 this.TotalCount = total;
 17                 this.PageSize = pageSize;
 18                 this.TotalPages = total / pageSize;
 19                 if (total % pageSize > 0)
 20                     TotalPages++;
 21                 this.PageSize = PageSize;
 22                 if (index > this.TotalPages)
 23                 {
 24                     index = this.TotalPages;
 25                 }
 26                 if (index < 1)
 27                 {
 28                     index = 1;
 29                 }
 30                 this.PageIndex = index;
 31                 List<T> resultSet = source.Skip((PageIndex-1) * PageSize).Take(PageSize).ToList();
 32                 this.AddRange(resultSet);//Skip跳过指定条数,Take返回多少条
 33             }
 34         }
 35
 36         /// <summary>
 37         /// 数据源为IQueryable的范型
 38         /// </summary>
 39         /// <param name="source">数据源</param>
 40         /// <param name="index">当前页</param>
 41         /// <param name="pageSize">页大小</param>
 42         public PagedQueryableToListModel(IQueryable<T> source, int index, int pageSize, out int totalCount)
 43         {
 44             //判断传过来的实体集是否为空
 45             if (source != null)
 46             {
 47                 totalCount = source.Count();
 48                 this.TotalCount = totalCount;
 49                 this.PageSize = pageSize;
 50                 this.TotalPages = totalCount / pageSize;
 51                 if (totalCount % pageSize > 0)
 52                     TotalPages++;
 53                 this.PageSize = PageSize;
 54                 if (index > this.TotalPages)
 55                 {
 56                     index = this.TotalPages;
 57                 }
 58                 if (index < 1)
 59                 {
 60                     index = 1;
 61                 }
 62                 this.PageIndex = index;
 63                 List<T> resultSet = source.Skip((PageIndex - 1) * PageSize).Take(PageSize).ToList();
 64                 this.AddRange(resultSet);//Skip跳过指定条数,Take返回多少条
 65             }
 66             else
 67             {
 68                 totalCount = 0;
 69             }
 70         }
 71
 72         /// <summary>
 73         /// 总记录数
 74         /// </summary>
 75         public int TotalCount { get; set; }
 76         /// <summary>
 77         /// 总页数
 78         /// </summary>
 79         public int TotalPages { get; set; }
 80         /// <summary>
 81         /// 当前页
 82         /// </summary>
 83         public int PageIndex { get; set; }
 84         /// <summary>
 85         /// 页面大小
 86         /// </summary>
 87         public int PageSize { get; set; }
 88         /// <summary>
 89         /// 是否上一页
 90         /// </summary>
 91         public bool IsPreviousPage
 92         {
 93             get
 94             {
 95                 return PageIndex-1 > 0;
 96             }
 97         }
 98         /// <summary>
 99         /// 是否下一页
100         /// </summary>
101         public bool IsNextPage
102         {
103             get
104             {
105                 return (PageIndex * PageSize) < TotalCount;
106             }
107         }
108
109
110     }
  1 // PagedCacheToListModel<T>泛型类
  2 public class PagedCacheToListModel<T> : List<T>, IPagedList
  3     {
  4         /// <summary>
  5         /// 数据源为List的范型
  6         /// </summary>
  7         /// <param name="source">数据源</param>
  8         /// <param name="index">当前页</param>
  9         /// <param name="pageSize">页大小</param>
 10         public PagedCacheToListModel(List<T> source, int index, int pageSize)
 11         {
 12             //判断传过来的实体集是否为空
 13             if(source != null)
 14             {
 15                 int total = source.Count;
 16                 this.TotalCount = total;
 17                 this.PageSize = pageSize;
 18                 this.TotalPages = total / pageSize;
 19                 if (total % pageSize > 0)
 20                     TotalPages++;
 21                 this.PageSize = PageSize;
 22                 if (index > this.TotalPages)
 23                 {
 24                     index = this.TotalPages;
 25                 }
 26                 if (index < 1)
 27                 {
 28                     index = 1;
 29                 }
 30                 this.PageIndex = index;
 31                 List<T> resultSet = source.Skip((PageIndex-1) * PageSize).Take(PageSize).ToList();
 32                 this.AddRange(resultSet);//Skip跳过指定条数,Take返回多少条
 33             }
 34         }
 35
 36         /// <summary>
 37         /// 数据源为List集合数据
 38         /// </summary>
 39         /// <param name="source">数据源</param>
 40         /// <param name="index">当前页</param>
 41         /// <param name="pageSize">页大小</param>
 42         public PagedCacheToListModel(List<T> source, int index, int pageSize, out int totalCount)
 43         {
 44             //判断传过来的实体集是否为空
 45             if (source != null)
 46             {
 47                 totalCount = source.Count;
 48                 this.TotalCount = totalCount;
 49                 this.PageSize = pageSize;
 50                 this.TotalPages = totalCount / pageSize;
 51                 if (totalCount % pageSize > 0)
 52                     TotalPages++;
 53                 this.PageSize = PageSize;
 54                 if (index > this.TotalPages)
 55                 {
 56                     index = this.TotalPages;
 57                 }
 58                 if (index < 1)
 59                 {
 60                     index = 1;
 61                 }
 62                 this.PageIndex = index;
 63                 List<T> resultSet = source.Skip((PageIndex - 1) * PageSize).Take(PageSize).ToList();
 64                 this.AddRange(resultSet);//Skip跳过指定条数,Take返回多少条
 65             }
 66             else
 67             {
 68                 totalCount = 0;
 69             }
 70
 71         }
 72
 73         /// <summary>
 74         /// 总记录数
 75         /// </summary>
 76         public int TotalCount { get; set; }
 77         /// <summary>
 78         /// 总页数
 79         /// </summary>
 80         public int TotalPages { get; set; }
 81         /// <summary>
 82         /// 当前页
 83         /// </summary>
 84         public int PageIndex { get; set; }
 85         /// <summary>
 86         /// 页面大小
 87         /// </summary>
 88         public int PageSize { get; set; }
 89         /// <summary>
 90         /// 是否上一页
 91         /// </summary>
 92         public bool IsPreviousPage
 93         {
 94             get
 95             {
 96                 return PageIndex-1 > 0;
 97             }
 98         }
 99         /// <summary>
100         /// 是否下一页
101         /// </summary>
102         public bool IsNextPage
103         {
104             get
105             {
106                 return (PageIndex * PageSize) < TotalCount;
107             }
108         }
109
110     }

构建泛型方法调用分页实体类

 1     public static class ExtendPagedList
 2     {
 3
 4         /// <summary>
 5         /// static方法 传递linq返回分页数据
 6         /// </summary>
 7         /// <typeparam name="T">IQueryable集合</typeparam>
 8         /// <param name="linq">数据源</param>
 9         /// <param name="pageIndex">当前页</param>
10         /// <param name="pageSize">页面大小</param>
11         /// <returns></returns>
12         public static PagedQueryableToListModel<T> ToPagedList<T>(this IQueryable<T> linq, int pageIndex, int pageSize)
13         {
14             return new PagedQueryableToListModel<T>(linq, pageIndex, pageSize);
15         }
16
17         /// <summary>
18         /// static方法 传递linq返回分页数据  及 数据总数
19         /// </summary>
20         /// <typeparam name="T">IQueryable集合</typeparam>
21         /// <param name="linq"></param>
22         /// <param name="pageIndex"></param>
23         /// <param name="pageSize"></param>
24         /// <param name="totalCount">返回数据总数</param>
25         /// <returns></returns>
26         public static PagedQueryableToListModel<T> ToPagedList<T>(this IQueryable<T> linq, int pageIndex, int pageSize, out int totalCount)
27         {
28             return new PagedQueryableToListModel<T>(linq, pageIndex, pageSize, out totalCount);
29         }
30         /// <summary>
31         /// 返回List集合分页数据
32         /// </summary>
33         /// <typeparam name="T">List集合</typeparam>
34         /// <param name="list"></param>
35         /// <param name="pageIndex"></param>
36         /// <param name="pageSize"></param>
37         /// <returns></returns>
38         public static PagedCacheToListModel<T> PagedCacheToList<T>(this List<T> list, int pageIndex, int pageSize)
39         {
40             return new PagedCacheToListModel<T>(list, pageIndex, pageSize);
41         }
42         /// <summary>
43         /// 返回List集合分页数据 及 数据总数
44         /// </summary>
45         /// <typeparam name="T">List集合</typeparam>
46         /// <param name="list"></param>
47         /// <param name="pageIndex"></param>
48         /// <param name="pageSize"></param>
49         /// <param name="totalCount">返回总数</param>
50         /// <returns></returns>
51         public static PagedCacheToListModel<T> PagedCacheToList<T>(this List<T> list, int pageIndex, int pageSize, out int totalCount)
52         {
53             return new PagedCacheToListModel<T>(list, pageIndex, pageSize, out totalCount);
54         }
55     }

之后是Controller中ActionResult方法返回数据

 1         public ActionResult Index(int indexPage=1, int pageSize=5)
 2         {
 3             XiaoMiViewModel miView = new XiaoMiViewModel();
 4             using(XiaoMiEntities db =new XiaoMiEntities())
 5             {
 6                 //IQueryable集合
 7                 var xiaomiSet1 = (from i in db.xiaomi
 8                                  orderby i.id
 9                                  select new XiaoMiModel
10                                      {
11                                          id = i.id,
12                                          username = i.username,
13                                          email = i.email
14                                      }).AsQueryable();
15
16                 int totalCount = default(int);//总数
17                 //此处为IQueryable集合
18                 miView.PageData = ExtendPagedList.ToPagedList(xiaomiSet1, indexPage, pageSize, out totalCount);
19
20                 //list集合数据
21                 var xiaomiSet2 = (from i in db.xiaomi
22                                  orderby i.id
23                                  select new XiaoMiModel
24                                  {
25                                      id = i.id,
26                                      username = i.username,
27                                      email = i.email
28                                  }).ToList();
29                 //此处为list数据集合
30                 miView.CachePageData = ExtendPagedList.PagedCacheToList(xiaomiSet2, indexPage, pageSize, out totalCount);
31                 miView.TotalCount = totalCount;
32             }
33             return View(miView);
34         }

在razor视图中展示分页数据

@model PagedListModel.ViewModels.XiaoMiViewModel
@{
    ViewBag.Title = "Index";
}
<h2>IQueryable集合(sql直接分页)数据分页</h2>
@foreach (var Data in Model.PageData.ToList())
{
    <p>ID:@Data.id : @Data.username</p>
}
<!--IQueryable集合(sql直接分页)数据分页 Start-->
<p>
    总数:@Model.TotalCount
    <br />
    @if (Model.PageData.IsPreviousPage)
    {
        <a href="@Url.Action("Index", "Test", new { indexPage = Model.PageData.PageIndex - 1 })">上一页</a>
    }
    else
    {
        <em style="color:Gray">上一页</em>
    }
    @if (Model.PageData.IsNextPage)
    {
        <a href="@Url.Action("Index", "Test", new { indexPage = Model.PageData.PageIndex + 1 })">下一页</a>
    }
    else
    {
        <em style="color:Gray">下一页</em>
    }
</p>
<br />
<hr />
<h2>List数据直接分页</h2>

<!--end-->
@foreach (var Data in Model.CachePageData.ToList())
{
    <p>ID:@Data.id : @Data.username</p>
}
<!--直接list集合数据分页 Start-->
<p>
    总数:@Model.TotalCount
    <br />
    @if (Model.CachePageData.IsPreviousPage)
    {
        <a href="@Url.Action("Index", "Test", new { indexPage = Model.CachePageData.PageIndex - 1 })">上一页</a>
    }
    else
    {
        <em style="color:Gray">上一页</em>
    }
    @if (Model.CachePageData.IsNextPage)
    {
        <a href="@Url.Action("Index", "Test", new { indexPage = Model.CachePageData.PageIndex + 1 })">下一页</a>
    }
    else
    {
        <em style="color:Gray">下一页</em>
    }
</p>
<!--end-->

好了 以上就是分页所有步骤了 。。。。

  

Mvc Linq 分页 参考PagedList

时间: 2024-10-29 19:07:08

Mvc Linq 分页 参考PagedList的相关文章

详解ASP.NET MVC数据分页

ASP.NET MVC框架已经进入2.0时代,本文将从ASP.NET MVC数据分页谈起,希望能对大家有所帮助. 在网页上进行表格资料或其他显示资料的分页是一种十分常见的需求,以前我们有 GridView 或 DataPager 可以帮我们自动分页,虽然到了 ASP.NET MVC 一切全部重头来过,但我们也不用真的那麽辛苦的自己实做分页,因为早就有人帮我们写好程式并开放原始码分享给这个世界了. 如果你已经体会到在 ASP.NET MVC 中妥善利用强型别(Strong Typed)特性进行开发

MVC中分页的实现

我在格斗人网 (www.helpqy.com) 中使用了下面的分页技术. 分页可以采用troygoode提供的开源包,其开源网站主页为:https://github.com/TroyGoode/PagedList.具体使用方法如下所示: 1. 通过NuGet下载PagedList.Mvc包,这个包会自动下载另外一个包PagedList,如下所示: 2. 在controller中引入以上两个包,如下所示: 3. 在controller中的ActionResult函数中按照如下最小结构进行调用: 1

MVC简单分页

对Car汽车表分页 实现简单分页,放在这里方便查看回顾,自定义每页几条有点问题,有待完善······ 1.新建mvc项目 2.添加linq to sql 数据库连接 3.添加CarBF类 using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace Mvc简单分页.Models { public class CarBF { private MyDBDataContext

asp.net mvc简单分页实例

@{ ViewBag.Title = "Index"; } @{ int pageIndex = (int)ViewBag.CurrentPage; int pageCount = (int)ViewBag.Pages; } <h2>Index</h2> <table> <tr> <th>cateId</th> <th>cateName</th> <th>cateNote<

MVC快速分页

.NET手记-ASP.NET MVC快速分页的实现 对于Web应用,展示List是很常见的需求,随之而来的常见的分页组件.jQuery有现成的分页组件,网上也有着大量的第三方分页组件,都能够快速实现分页功能.但是今天我描述的是用基本的C#和html代码实现的分页,不借助任何第三方组件. 实现思路 这里的实现主要借助ViewModel和HtmlHelper实现,通过传递分页参数PagingInfo来实现. 创建分页参数类PagingInfo.cs using System; namespace C

Linq分页

/// <summary> /// Linq分页 /// </summary> int pagesize = 2;//每页条数 int recordcount = 0;//总条数 int pageindex = 1;//当前第几页 public static string con = ConfigurationManager.ConnectionStrings["MySQLDBConnectionString"].ConnectionString; GuestB

MVC——mvc+linq+EF对数据表的查删改

上篇博客中简单的介绍了MVC的组成以及各部分的作用.这篇博客将介绍MVC+linq+EF框架实现对数据表的查询.删除.修改. 先说一下什么是Linq? linq是基于关系数据的.net语言集成查询,用于对象形式管理关系数据.在本篇博客的实例中主要使用linq进行查询数据. 再说一下什么是EF? 说到EF不得不先说一下ORM,ORM全称:(Object-Relation  Mapping)即对象-关系映射.ORM是将关系数据库中的业务数据用对象的形式表现出来,并通过面向对象的方式将这些对象组织起来

Linq 分页不可缺少的两个方法

//LINQ分页的方法 //1.获取总页数 public int GetPageCount(int pageSize)//pageSize是每页的行数 { //先查出总共有多少行 int rowCount = this._Context.car.Count(); //页数=总行数/每页行数 int pageCount =(int) Math.Ceiling(1.0 * rowCount / pageSize); return pageCount; } //2.查询出指定页的数据 public L

Mvc自定义分页控件

MVC开发分页常常使用第三方控件,生成的分页HTML带有版权申明,虽然免费,但是总有的别扭.于是,某日,楼主闲来蛋疼,折腾了个自定义分页控件: 先来展示下效果图: 1>当分页不超过10页的时候,完全显示出来: 2>当分页超过10页,效果图如下所示: 再来看看生成的分页代码,竟然和楼主一样纯洁!!! 3>支持自定义路由.参数.页码html格式.首末页是否显示.上下页是否显示.URL分页参数传递功能. 使用方法: 1.引用 YYP.PagerHtml.dll 2.页面使用 @using YY