Lind.DDD.Paging分頁模塊介紹

来源:http://www.cnblogs.com/lori/archive/2016/02/03/5178978.html
-Advertisement-
Play Games

回到目錄 分頁組件網上有很多,MVC.Pager,JSPager等,通過實現方式大體分為前端分頁和後端分頁,前端分頁是前臺對list記憶體本地集合進行分頁,缺點就是在大數據情況下,記憶體占用過高;後端分頁就是UI把要返回的頁號告訴後臺,由後臺組織數據並返回,這種方法就是我們經常看到的了;而根據後臺集合種


回到目錄

分頁組件網上有很多,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 = 10;
        }

        /// <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 > 0); } }

        /// <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, 0, 0)
        {
        }
        /// <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 > 0)
                    TotalPages++;

                this.PageSize = pageSize;
                if (index > this.TotalPages)
                {
                    index = this.TotalPages;
                }
                if (index < 1)
                {
                    index = 1;
                }
                this.PageIndex = index;
                this.AddRange(source.Skip((index - 1) * 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 > 0)
                    TotalPages++;

                this.PageSize = pageSize;
                if (index > this.TotalPages)
                {
                    index = this.TotalPages;
                }
                if (index < 1)
                {
                    index = 1;
                }
                this.PageIndex = index;
                this.AddRange(source.Skip(0).Take(index * pageSize).ToList()); //Skip是跳到第幾頁,Take返回多少條
            }
        }
    }

有一點要特別註意一下,在LINQ分頁時,我們看到被傳入的集合一定是IQueryable的,如果是本地IList集合,那就失去了分頁的意義,它相當於把所有數據載入到記憶體,然後再分頁了。

有了數據的返回,下麵再來看一下前臺頁面的組織,我們也封裝了一個PagerHelper的方法,當然你也可以在分部頁上進行設計,這都是可以的。

我們在前臺調用時為大家封裝了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"] ?? "1").ToString());

    var pageCount = int.Parse((route["pageCount"] ?? Request.QueryString["pageCount"] ?? "1").ToString());
    if (currentPage < 1)
    {
        currentPage = 1;
    }
    if (currentPage > pageCount)
    {
        currentPage = pageCount;
    }
}
<div>
    <span>@Html.ActionLink("首頁", action, controller, new { page = 1 })</span>
    <span>@Html.ActionLink("上一頁", "Index", new { page = currentPage - 1 })</span>
    <span>@Html.ActionLink("下一頁", "Index", new { page = currentPage + 1 })</span>
    <span>@Html.ActionLink("尾頁", "Index", new { page = pageCount })</span>
    <span>@currentPage/@pageCount</span>
</div>

感謝各位的耐心閱讀!

回到目錄

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Description: 求1!+2!+3!+4!+...+n!的結果。 Input: 輸入數據含有不多於50個的正整數n(1≤n≤12)。 Output: 對於每個n,輸出計算結果。每個計算結果應占獨立一行。 Sample Input: 3 6 Sample Output: 9 873 #incl
  • 本文從3個方面對Socket編程進行詳解: 一,網路編程中兩個主要的問題 二,兩類傳輸協議:TCP;UDP 三,基於Socket的java網路編程 一,網路編程中兩個主要的問題 一個是如何準確的定位網路上一臺或多台主機,另一個就是找到主機後如何可靠高效的進行數據傳輸。 在TCP/IP協議中IP層主要
  • <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <m
  • <!-- MyBatis框架 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.2.8</version> </dependency> <!-- MySql資料庫驅動
  • 之前寫了一題費用流,竟然硬是在寫SPFA時為DIS數組賦初始值用了MEMSET數組QAQ 調試了很久也沒有弄明白自己是卡在那裡了,,,感覺被自己蠢哭了QWQ 錯誤的姿勢!! #include <cstring> #include <iostream> #include <cstdio> using
  • list是一種有序的集合,可以隨時添加和刪除其中的元素。定義有序的集合: classmates = ['Michael', 'Bob', 'Tracy'] 用len()函數可以獲得list元素的個數: len(classmates) 用索引來訪問list中每一個位置的元素,記得索引是從0開始的: c...
  • >>> print('The quick brown fox', 'jumps over', 'the lazy dog') The quick brown fox jumps over the lazy dog print()會依次列印每個字元串,遇到逗號“,”會輸出一個空格,因此,輸出的字元串是...
  • 試題描述: 有 n 個同學(編號為 1 到 n )正在玩一個信息傳遞的游戲。在游戲里每人都有一個固定的信息傳遞對象,其中,編號為 i 的同學的信息傳遞對象是編號為 T_i 的同學。游戲開始時,每人都只知道自己的生日。之後每一輪中,所有人會同時將自己當前所知的生日信息告訴各自的信息傳遞對象(註意:可能
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...