在做web應用的時候免不了要對數據進行分頁,我最近在做asp.net core的開發的時候就遇到了這個需求,現在簡單的記錄一下:
public class PaginatedList<T>:List<T> { /// <summary> /// 當前頁 /// </summary> public int PageIndex { get; set; } //總頁面數 public int TotalPages { get; set; } public PaginatedList(List<T> items, int count, int pageIndex, int pageSize) { PageIndex = pageIndex; TotalPages = (int)Math.Ceiling(count / (decimal)pageSize); this.AddRange(items); } /// <summary> /// 判斷是否有上一頁 /// </summary> public bool HasPreViousPage => (PageIndex > 1); /// <summary> /// 判斷是否有下一頁 /// </summary> public bool HasNextPage => PageIndex < TotalPages; /// <summary> /// 創建分頁 /// </summary> /// <param name="source">實體信息</param> /// <param name="pageIndex">當前頁</param> /// <param name="pageSize">當前頁數據條數</param> /// <returns></returns> public static async Task<PaginatedList<T>> CreatepagingAsync(IQueryable<T> source,int pageIndex,int pageSize) { //返回實體總條數 var count = await source.CountAsync(); var items = await source.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToListAsync(); var dtos=new PaginatedList<T>(items,count,pageIndex,pageSize); return dtos; } }
主要的知識點:
①這個類表示一個分頁,將與分頁有關的內容集成到單個類中,符合單一職責原則
②PageIndex記錄當前頁,TotalPages記錄總的頁數,在構造函數執行的時候,會傳入必要的參數來初始化這些字段,構造函數的方法簽名為(List<T> items, int count, int pageIndex, int pageSize)不難看出,傳入的pageindex參數來初始化當前頁,這個pageindex參數肯定是由頁面來傳入的,pageSize是自定義的一個數據,你想讓一個頁面顯示多少條記錄,就定義成多少。還有一個List<T>類型的item,由這個傳入的參數來確定item的總條數(item.Count()),然后由了總的條數和每頁的條數就可以得出總的頁數。
③在CreatepagingAsync這個方法中會返回一個構造好的分頁類。具體看代碼注釋