MVC HtmlHelper擴展——實現分頁功能

来源:http://www.cnblogs.com/xiangyisheng/archive/2017/05/05/6814027.html
-Advertisement-
Play Games

MVC HtmlHelper擴展類(PagingHelper) 後臺Controller代碼 前臺頁面代碼 最終效果圖: 作者:長毛象 微博:http://weibo.com/5567742196/info 博客:http://www.cnblogs.com/xiangyisheng/ 本文版權歸作 ...


MVC HtmlHelper擴展類(PagingHelper)

using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace HtmlHelperMvc.Models
{
    /// <summary>
    /// 分頁類如果一個頁面顯示兩個列表只需要複製該類到項目中重命名一個就可以
    /// </summary>
    public static class PagingHelper
    {
        #region 屬性Property
        /// <summary>
        /// 當前頁碼
        /// </summary>
        private static int? _currentPage = null;
        /// <summary>
        /// 當前頁碼
        /// </summary>
        public static int CurrentPage
        {
            get
            {
                return _currentPage ?? 1;
            }
            set
            {
                _currentPage = value;
            }
        }
        /// <summary>
        /// 每頁記錄條數
        /// </summary>
        private static int? _pageSize = null;
        /// <summary>
        /// 每頁記錄條數
        /// </summary>
        public static int PageSize
        {
            get
            {
                return _pageSize ?? 15;
            }
            set
            {
                _pageSize = value;
            }
        }
        /// <summary>
        /// 是否顯示上一頁
        /// </summary>
        public static bool HasPreviousPage
        {
            get
            {
                return (CurrentPage > 1);
            }
        }
        /// <summary>
        /// 是否顯示下一頁
        /// </summary>
        public static bool HasNextPage
        {
            get
            {
                return (CurrentPage < TotalPages);
            }
        }
        /// <summary>
        /// 當前頁:
        /// </summary>
        public static string CurrentPageDisplayName { get; set; }
        /// <summary>
        /// 每頁顯示:
        /// </summary>
        public static string PageSizeDisplayName { get; set; }
        public static string FirstDisplayName { get; set; }
        public static string PreDisplayName { get; set; }
        public static string NextDisplayName { get; set; }
        public static string LastDisplayName { get; set; }
        public static string TotalCountDisplayName { get; set; }
        public static string TotalPagesDisplayName { get; set; }
        /// <summary>
        /// 總條數
        /// </summary>
        public static int TotalCount
        {
            get;
            set;
        }
        public static int TotalPages
        {
            get
            {
                return (int)Math.Ceiling(TotalCount / (double)PageSize);
                //return (TotalCount % PageSize == 0 ? TotalCount / PageSize : TotalCount / PageSize + 1);
            }
        }
        /// <summary>
        /// 設置分頁url eg:/Admin/Product/Index
        /// </summary>
        public static string PagingUrl
        {
            get;
            set;
        }
        /// <summary>
        /// 預設page,設置分頁參數名 eg:/Admin/Product/Index?PagingParamName=1
        /// </summary>
        public static string PagingParamName
        {
            get;
            set;
        }
        #endregion
        #region Paging String
        /// <summary>
        /// MVC分頁 如果用jquery分頁只需要class不需要href,用以下實現:
        /// $(".class值").live("click", function () {
        /// var page = $(this).attr("pagingParamName值");
        /// $("#order").html("").load("/Customer/Order?page="+page);
        /// });live自動給遍歷增加事件
        /// </summary>
        /// <param name="html"></param>
        /// <param name="htmlAttributes">new {@class="grey",pagingParamName="page",href="/Admin/Product/Index"} pagingParamName預設page,匿名類添加控制項屬性</param>
        /// <returns></returns>
        public static MvcHtmlString Paging(this System.Web.Mvc.HtmlHelper html, object htmlAttributes)
        {
            RouteValueDictionary values = new RouteValueDictionary(htmlAttributes);
            #region 屬性賦值
            if (values["href"] != null)
            {
                PagingUrl = values["href"].ToString();
            }
            if (values["pagingParamName"] != null)
            {
                PagingParamName = values["pagingParamName"].ToString();
                values.Remove("pagingParamName");
            }
            else
            {
                PagingParamName = "page";
            }
            #endregion
            #region 分頁最外層div/span
            TagBuilder builder = new TagBuilder("div");//span
            //創建Id,註意要先設置IdAttributeDotReplacement屬性後再執行GenerateId方法. 
            //builder.IdAttributeDotReplacement = "_";
            //builder.GenerateId(id);
            //builder.AddCssClass("");
            //builder.MergeAttributes(values);
            builder.InnerHtml = PagingBuilder(values);
            #endregion
            return MvcHtmlString.Create(builder.ToString(TagRenderMode.Normal));//解決直接顯示html標記
        }
        private static string PagingBuilder(RouteValueDictionary values)
        {
            #region 條件搜索時包括其他參數
            StringBuilder urlParameter = new StringBuilder();
            NameValueCollection collection = HttpContext.Current.Request.QueryString;
            string[] keys = collection.AllKeys;
            for (int i = 0; i < keys.Length; i++)
            {
                if (keys[i].ToLower() != "page")
                {
                    urlParameter.AppendFormat("&{0}={1}", keys[i], collection[keys[i]]);
                }
            }
            #endregion
            //CurrentPage = Convert.ToInt32(HttpContext.Current.Request.QueryString["page"] ?? "0");
            StringBuilder sb = new StringBuilder();
            #region 分頁統計
            sb.AppendFormat("Total &nbsp;{0} &nbsp; Records Page &nbsp;{1} of &nbsp;{2}  &nbsp; ", TotalCount, CurrentPage, TotalPages);
            #endregion
            #region 首頁 上一頁
            sb.AppendFormat(TagBuilder(values, 1, " First"));
            //sb.AppendFormat("<a href={0}?page=1{1}>First</a>&nbsp;",url,urlParameter);
            if (HasPreviousPage)
            {
                sb.AppendFormat(TagBuilder(values, CurrentPage - 1, "   Prev   "));
                //sb.AppendFormat("<a href={0}?page={1}{2}>Prev</a>&nbsp;", url, CurrentPage - 1, urlParameter);
            }
            #endregion
            #region 分頁邏輯
            if (TotalPages > 10)
            {
                if ((CurrentPage + 5) < TotalPages)
                {
                    if (CurrentPage > 5)
                    {
                        for (int i = CurrentPage - 5; i <= CurrentPage + 5; i++)
                        {
                            sb.Append(TagBuilder(values, i, i.ToString()));
                        }
                    }
                    else
                    {
                        for (int i = 1; i <= 10; i++)
                        {
                            sb.Append(TagBuilder(values, i, i.ToString()));
                        }
                    }
                    sb.Append("...&nbsp;");
                }
                else
                {
                    for (int i = CurrentPage - 10; i <= TotalPages; i++)
                    {
                        sb.Append(TagBuilder(values, i, i.ToString()));
                    }
                }
            }
            else
            {
                for (int i = 1; i <= TotalPages; i++)
                {
                    sb.Append("&nbsp;" + TagBuilder(values, i, i.ToString()) + "&nbsp");
                }
            }
            #endregion
            #region 下一頁 末頁
            if (HasNextPage)
            {
                sb.AppendFormat(TagBuilder(values, CurrentPage + 1, "Next"));
                //sb.AppendFormat("<a href={0}?page={1}{2}>Next</a>&nbsp;", url, CurrentPage + 1, urlParameter);
            }
            sb.AppendFormat(TagBuilder(values, TotalPages, "Last"));
            //sb.AppendFormat("<a href={0}?page={1}{2}>Last</a>",url,TotalPages,urlParameter);
            #endregion
            return sb.ToString();
        }
        private static string TagBuilder(RouteValueDictionary values, int i, string innerText)
        {
            values[PagingParamName] = i;
            TagBuilder tag = new TagBuilder("a");
            if (PagingUrl != null)
            {
                values["href"] = PagingUrl + "?" + PagingParamName + "= " + i + "&nbsp;&nbsp;&nbsp;";
            }
            if (CurrentPage == i && innerText != " First" && innerText != " Last")
            {
                values["id"] = "on";
            }
            else
            {
                tag.Attributes["id"] = "";
            }
            tag.MergeAttributes(values);
            tag.SetInnerText(innerText);
            return tag.ToString();
        }
        #endregion
    }
}

後臺Controller代碼

//
// GET: /Home/

public ActionResult Index(int? page)
{
    page = page ?? 1;
    PagingHelper.CurrentPage = Convert.ToInt32(page);
    PagingHelper.PageSize = 20;

    //{獲取數據集的中條數,以及分頁的數據集}

    PagingHelper.TotalCount = 2000;
    return View();
}

前臺頁面代碼

@{
    ViewBag.Title = "Index";
}
@using HtmlHelperMvc.Models;
<h2>Index</h2>
<hr />
<style type="text/css">
    #on
    {
        color: #FFF;
        background-color: #337AB7;
        border-color: #337AB7;
    }

    .pagination a
    {
        margin-right: 3px;
        padding: 5px 10px;
        font-size: 12px;
        text-decoration: none;
        background-color: #fff;
        border: 1px solid #ddd;
        cursor: pointer;
        display: inline-block;
        border-radius: 3px;
    }

    a
    {
        color: #337ab7;
        text-decoration: none;
    }

    a
    {
        background-color: transparent;
    }

    *
    {
        -webkit-box-sizing: border-box;
        -moz-box-sizing: border-box;
        box-sizing: border-box;
    }
</style>
<script src="~/Scripts/jquery-1.8.2.js"></script>
<script type="text/javascript">
    $(function () {
        $(".pagination .active").live("click", function () {
            $("#page").val($(this).attr("page"));
            $("#form_Submit").submit();
        });
    });
</script>
<form id="form_Submit" action="/Home/Index" method="post">
    <div class="fix">
        <div class="page">
            <div class="pagination pagination-sm pull-right" id="pageDiv" style="margin: 0px 0;">
                <input type="hidden" id="page" name="page" value="@PagingHelper.CurrentPage" />
                @Html.Paging(new { @class = "active" })
            </div>
        </div>
    </div>
</form>

最終效果圖:

作者:長毛象 微博:http://weibo.com/5567742196/info 博客:http://www.cnblogs.com/xiangyisheng/ 本文版權歸作者和博客園共有,個人學習成果,請多多指教,歡迎轉載,請保留原文鏈接

 


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

-Advertisement-
Play Games
更多相關文章
  • 在好多的.net的書籍中都看到過逆變和協變的概念,也在網上搜了一些關於這兩個概念的解釋,但是一直感覺似懂非懂的,直到最近在項目中實際遇到了一個問題,恰好用到了逆變,總算對逆變的理解又進了一步。 逆變只能用到泛型介面和委托中,以前一直不理解為什麼要用在泛型中,今天終於想明白了。在介紹逆變之前,先來說說 ...
  • 一直很羡慕和佩服園子中伍華聰的界面設計和佈局。好多年都沒有真正寫過C/S項目了,今天翻出來6年前剛開始學習WinForm的時候寫的一個簡單的HR管理系統,思緒一下子很複雜,記得是6年前的夏天,天氣很熱,租住的房子里沒有空調,身邊放個扇子,人家周末出去玩的時候,我還在拼命的敲著代碼,一心只想著好好提高 ...
  • 在使用Sqlhelper類時,出現cs0103錯誤 當前上下文中不存在名稱configurationmanager 解決方案,除了using引用using System.Configuration外,還需在解決方案資源管理器里的“引用”中添加“System.Configuration”。 ...
  • 這個訪問層的代碼實際上是園子里某個前輩的,本人只是覺得好使,記錄了下來。 本訪問層需要通過Nuget安裝EntityFramework Core,不過個人認為EF 6同樣可以使用。 搭配資料庫,最好是Sql Server(微軟支持,你懂的) 下麵貼代碼 先是IRepository.cs 然後是實現 ...
  • 雖然2月初就回來了,可 CoreCRM 一直到5月才開始恢復開發,期間是各種生活中的意外和不方便。 1. 為什麼要重構 首先是一件很值得高興的事情:CoreCRM 有了第一位 contributor! "Larry" 是我原來的一位實習生,現在在某公司做前端開發。因為 Larry 的加入,我就不再是 ...
  • C#獲取操作系統相關的信息,如記憶體大小,CPU大小,機器名,環境變數等操作系統軟體、硬體相關信息 ...
  • 效果圖: 大致代碼: 1 <script type="text/javascript"> 2 $(function () { 3 LoadOrderDetailList(); 4 }); 5 function AddToOrderDetailInfo() { 6 $("#AddToOrderDeta ...
  • 1.8.0更新的內容有 破壞性更新 更新ZKWeb.System.Drawing到3.0.0 請修改源代碼中的 到`System.DrawingCore` 現在已經不再需要使用 選項,因為使用這個選項也不能完全防止衝突 一般更新 添加IActionParameterProvider 可以自定義獲取a ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...