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         }
View Code

在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-->
View Code

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

   

Mvc Linq 分页 参考PagedList,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。