學用MVC4做網站:分頁控件


瀏覽欄目下內容的時候肯定要用到分頁,MVC4下沒有帶分頁控件,那么就自己寫一個HtmlHelper-Pager。寫之前看了一些大神的分頁控件,啟發很大。先設想一下自己的分頁控件:

分頁控件分普通分頁(Pager)和Ajax分頁(PagerAjax)兩塊。兩塊的顯示相同,如圖:

image

各部說明:

編號

名稱

類型

控件id

cssClass

說明

1

總記錄數

 

 

 

 

2

每頁記錄數

 

 

 

 

3

總頁數

 

 

 

 

4

首頁

A

 

linkbtn

一般情況

span

 

btn

當前頁為第一頁時

5

上一頁

A

 

linkbtn

一般情況

span

 

btn

當前頁為第一頁時

6

上一批

A

 

linkbatch

當前頁為第一頁時不顯示

7

數字鏈接

A

 

linknum

 

8

下一批

A

 

linkbatch

一般情況

9

下一頁

A

 

linkbtn

 

span

 

btn

當前頁為最后一頁時

10

尾頁

A

 

linkbtn

 

span

 

btn

當前頁為最后一頁時

11

頁碼下拉框

select

nspagerselect

 

 

12

頁碼輸入框

input

nspagernum

 

 

13

當前頁碼

span

currentnum

 

 

在開始寫之前還要先有兩個類:一個是分頁設置類,一個是分頁數據類。

分頁的設置類包含了常用的分頁參數,是為了方便保存到數據庫中,可以直接在欄目中設置該欄目下每頁顯示的記錄數;記錄的計量單位:是“條”還是“篇”;記錄的名稱是“新聞”、“文章”還是“教程”等。

分頁設置模型

字段

名稱

類型

必填

默認值

說明

PagerConfigId

ID

Int

True

 

主鍵

CurrentPage

當前頁

Int

 

1

不映射到數據庫

PageSize

每頁顯示記錄數

Int

True

20

 

TotalPage

總頁數

Int

 

 

不映射到數據庫

TotalRecord

總記錄數

Int

 

 

不映射到數據庫

RecordUnit

記錄計數單位

string

True

記錄的數量單位。如文章為“篇”;新聞為“條”"

RecordName

記錄名稱

string

True

記錄

記錄的名稱。如“文章”、“新聞”、“教程”等"

分頁數據類

用來提供記錄列表和分頁設置PagerData<T> 繼承自 List<T>

字段

名稱

類型

必填

默認值

說明

Config

分頁配置

PagerConfig

 

 

分頁數據包含的分頁設置

想好直接之后,開始設置基礎函數

1pager的基礎函數

Pager(this HtmlHelper htmlHelper, string actionName, string controllerName, RouteValueDictionary routeValues, PagerConfig pageConfig, string ctrlId, string cssClass, int digitalLinkNum, bool showTotalRecord, bool showCurrentPage, bool showTotalPage, bool showSelect, bool showInput)

參數說明:

actionName-動作名稱;

controllerName-控制器名稱;

routeValues-路由參數;

pageConfig-分頁配置;

ctrlId-分頁控件Id;

cssClass-分頁控件css類名;

digitalLinkNum-顯示的數字鏈接個數;

showTotalRecord-顯示總記錄數;

showCurrentPage-顯示當前頁;

showTotalPage-顯示總頁數;

showSelect-顯示頁碼下拉框;

showInput-顯示頁碼輸入框。

重載可能用到參數

currentPage-當前頁;

totalPage-總頁數;

pageSize-每頁顯示記錄數;

totalRecord-總記錄數;

recordUnit-記錄單位;

recordName-記錄名稱;

2PagerAjax基礎函數

public static MvcHtmlString PagerAjax(this HtmlHelper htmlHelper, string ctnrId, string actionName, string controllerName, RouteValueDictionary routeValues, PagerConfig pageConfig, string ctrlId, string cssClass, int digitalLinkNum, bool showTotalRecord, bool showCurrentPage, bool showTotalPage, bool showSelect, bool showInput)

參數說明:

ctnrId-內容容器Id。用於包裹ajax返回html的容器控件id

其他參數與1、pager相同

==========================

基本的東西都准備好了,寫代碼就快了。

右鍵點擊Extensions文件夾,添加類PagerExtensions

命名空間改為System.Web.Mvc,在該命名空間下先寫PagerConfig,再寫PagerData,代碼都很簡單。

namespace System.Web.Mvc
{
    /// <summary>
    /// 分頁配置
    /// </summary>
    public class PagerConfig
    {
        [Key]
        public int PagerConfigId { get; set; }
        /// <summary>
        /// 當前頁
        /// </summary>
        [NotMapped]
        public int CurrentPage { get; set; }
        /// <summary>
        /// 每頁記錄數
        /// </summary>
        [Display(Name = "每頁記錄數", Description = "每頁顯示的記錄數。")]
        [Required(ErrorMessage="×")]
        public int PageSize { get; set; }
        /// <summary>
        /// 總頁數
        /// </summary>
        [NotMapped]
        public int TotalPage { get { return (int)Math.Ceiling(TotalRecord / (double)PageSize); } }
        /// <summary>
        /// 總記錄數
        /// </summary>
        [NotMapped]
        public int TotalRecord { get; set; }
        /// <summary>
        /// 記錄單位
        /// </summary>
        [Display(Name="記錄單位",Description="記錄的數量單位。如文章為“篇”;新聞為“條”")]
        [Required(ErrorMessage = "×")]
        public string RecordUnit { get; set; }
        /// <summary>
        /// 記錄名稱
        /// </summary>
        [Display(Name = "記錄名稱", Description = "記錄的名稱。如“文章”、“新聞”、“教程”等")]
        [Required(ErrorMessage = "×")]
        public string RecordName { get; set; }

        public PagerConfig()
        {
            CurrentPage = 1;
            PageSize = 20;
            RecordUnit = "";
            RecordName = "記錄";
        }
    }

    /// <summary>
    /// 分頁數據
    /// </summary>
    public class PagerData<T> : List<T>
    {
        public PagerData(List<T> list, PagerConfig pagerConfig)
        {
            this.AddRange(list);
            Config = pagerConfig;
        }
        public PagerData(List<T> list, int currentPage, int pageSize, int totalRecord)
        {
            this.AddRange(list);
            Config.CurrentPage = currentPage;
            Config.PageSize = pageSize;
            Config.TotalRecord = totalRecord;
        }
        public PagerData(List<T> list, int currentPage, int pageSize, int totalRecord, string recordUnit, string recordName)
        {
            this.AddRange(list);
            Config.CurrentPage = currentPage;
            Config.PageSize = pageSize;
            Config.TotalRecord = totalRecord;
            Config.RecordUnit = recordUnit;
            Config.RecordName = recordName;
        }

        public PagerConfig Config { get; set; }
    }
}

下面到了關鍵部分:

在文件PagerExtensions.cs底部再添加一個命名空間namespace System.Web.Mvc.Html。

在里面添加靜態類public static class PagerExtensions。

在類中間添加函數public static MvcHtmlString Pager(……)

代碼也很容易就是用UrlHelper.Action生成鏈接的地址,再創建一個StringBuilder _strBuilder,不停的向里面附加html代碼,最后使用return MvcHtmlString.Create(_strBuilder.ToString());返回MvcHtmlString。就是寫的太亂啦

public static MvcHtmlString Pager(this HtmlHelper htmlHelper, string actionName, string controllerName, RouteValueDictionary routeValues, PagerConfig pageConfig, string ctrlId, string cssClass, int digitalLinkNum, bool showTotalRecord, bool showCurrentPage, bool showTotalPage, bool showSelect, bool showInput)
        {
            UrlHelper _url = new UrlHelper(htmlHelper.ViewContext.RequestContext);
            StringBuilder _strBuilder = new StringBuilder("<div id=\"" + ctrlId + "\" class=\"" + cssClass + "\">");
            if (showTotalRecord) _strBuilder.Append("" + pageConfig.TotalRecord + pageConfig.RecordUnit + pageConfig.RecordName + " ");
            if (showCurrentPage) _strBuilder.Append("每頁" + pageConfig.PageSize + pageConfig.RecordUnit + " ");
            if(showTotalPage) _strBuilder.Append("" + pageConfig.CurrentPage + "頁/共" + pageConfig.TotalPage + "");
            //首頁鏈接
            if (pageConfig.CurrentPage > 1)
            {
                routeValues["page"] = 1;
                _strBuilder.Append("<a class=\"linkbtn\" href=\"" + _url.Action(actionName, controllerName, routeValues) + "\">首頁</a>");
            }
            else _strBuilder.Append("<span class=\"btn\">首頁</span>");
            //上一頁
            if (pageConfig.CurrentPage > 1)
            {
                routeValues["page"] = pageConfig.CurrentPage - 1;
                _strBuilder.Append("<a class=\"linkbtn\" href=\"" + _url.Action(actionName, controllerName, routeValues) + "\">上一頁</a>");
            }
            else _strBuilder.Append("<span class=\"btn\">上一頁</span>");
            //數字導航開始
            int _startPage, _endPage;
            //總頁數少於要顯示的頁數,頁碼全部顯示
            if (digitalLinkNum >= pageConfig.TotalPage) { _startPage = 1; _endPage = pageConfig.TotalPage; }
            else//顯示指定數量的頁碼
            {
                int _forward = (int)Math.Ceiling(digitalLinkNum / 2.0);
                if (pageConfig.CurrentPage > _forward)//起始頁碼大於1
                {
                    _endPage = pageConfig.CurrentPage + digitalLinkNum - _forward;
                    if (_endPage > pageConfig.TotalPage)//結束頁碼大於總頁碼結束頁碼為最后一頁
                    {
                        _startPage = pageConfig.TotalPage - digitalLinkNum;
                        _endPage = pageConfig.TotalPage;

                    }
                    else _startPage = pageConfig.CurrentPage - _forward;
                }
                else//起始頁碼從1開始
                {
                    _startPage = 1;
                    _endPage = digitalLinkNum;
                }
            }
            //向上…
            if (_startPage > 1)
            {
                routeValues["page"] = _startPage - 1;
                _strBuilder.Append("<a class=\"linkbatch\" href=\"" + _url.Action(actionName, controllerName, routeValues) + "\">…</a>");
            }
            //數字
            for (int i = _startPage; i <= _endPage; i++)
            {
                if (i != pageConfig.CurrentPage)
                {
                    routeValues["page"] = i;
                    _strBuilder.Append("<a class=\"linknum\" href=\"" + _url.Action(actionName, controllerName, routeValues) + "\">" + i.ToString() + "</a>");
                }
                else
                {
                    _strBuilder.Append("<span class='currentnum'>" + i.ToString() + "</span>");
                }
            }
            //向下…
            if (_endPage < pageConfig.TotalPage)
            {
                routeValues["page"] = _endPage + 1;
                _strBuilder.Append("<a class=\"linkbatch\" href=\"" + _url.Action(actionName, controllerName, routeValues) + "\">…</a>");
            }
            ////數字導航結束
            //下一頁和尾頁
            if (pageConfig.CurrentPage < pageConfig.TotalPage)
            {
                routeValues["page"] = pageConfig.CurrentPage + 1;
                _strBuilder.Append("<a class=\"linkbtn\" href=\"" + _url.Action(actionName, controllerName, routeValues) + "\">下一頁</a>");
                routeValues["page"] = pageConfig.TotalPage;
                _strBuilder.Append("<a class=\"linkbtn\" href=\"" + _url.Action(actionName, controllerName, routeValues) + "\">尾頁</a>");
            }
            else _strBuilder.Append("<span class=\"btn\">下一頁</span><span class=\"btn\">尾頁</span>");
            //顯示頁碼下拉框
            if (showSelect)
            {
                routeValues["page"] = "-nspageselecturl-";
                _strBuilder.Append(" 跳轉到第<select id=\"nspagerselect\" data-url=\"" + _url.Action(actionName, controllerName, routeValues) + "\">");
                for (int i = 1; i <= pageConfig.TotalPage; i++)
                {
                    if (i == pageConfig.CurrentPage) _strBuilder.Append("<option selected=\"selected\" value=\"" + i + "\">" + i + "</option>");
                    else _strBuilder.Append("<option value=\"" + i + "\">" + i + "</option>");
                }
                _strBuilder.Append("</select>頁");
                _strBuilder.Append("<script type=\"text/javascript\">$(\"#" + ctrlId + " #nspagerselect\").change(function () { location.href = $(\"#" + ctrlId + " #nspagerselect\").attr(\"data-url\").replace(\"-nspageselecturl-\", $(\"#" + ctrlId + " #nspagerselect\").val());});</script>");
            }
            //顯示頁碼輸入框
            if (showInput)
            {
                routeValues["page"] = "-nspagenumurl-";
                _strBuilder.Append("轉到第<input id=\"nspagernum\" type=\"text\" data-url=\"" + _url.Action(actionName, controllerName, routeValues) + "\" />頁");
                _strBuilder.Append("<script type=\"text/javascript\">$(\"#" + ctrlId + " #nspagernum\").keydown(function (event) {if (event.keyCode == 13) location.href = $(\"#" + ctrlId + " #nspagernum\").attr(\"data-url\").replace(\"-nspagenumurl-\", $(\"#" + ctrlId + " #nspagernum\").val()); });</script>");
            }
            _strBuilder.Append("</div>");
            return MvcHtmlString.Create(_strBuilder.ToString());
        }

PagerAjax跟Pager基本一樣。不同點是在點擊鏈接的時候Pager是轉到相應頁面,PagerAjax是在點擊paer內的鏈接的時候利用jquery Post獲取鏈接指定頁面的html代碼替換內容包裹容器的html。實際上就是這句jquery語句

<script type="text/javascript">$("#ctrlId a").click(function () {$.post($(this).attr("href"), function (data) {$("#ctnrId").html(data);});return false; });</script>

PagerAjax的整個內容

public static MvcHtmlString PagerAjax(this HtmlHelper htmlHelper, string ctnrId, string actionName, string controllerName, RouteValueDictionary routeValues, PagerConfig pageConfig, string ctrlId, string cssClass, int digitalLinkNum, bool showTotalRecord, bool showCurrentPage, bool showTotalPage, bool showSelect, bool showInput)
        {
            UrlHelper _url = new UrlHelper(htmlHelper.ViewContext.RequestContext);
            StringBuilder _strBuilder = new StringBuilder("<div id=\"" + ctrlId + "\" class=\"" + cssClass + "\">");
            if (showTotalRecord) _strBuilder.Append("" + pageConfig.TotalRecord + pageConfig.RecordUnit + pageConfig.RecordName + " ");
            if (showCurrentPage) _strBuilder.Append("每頁" + pageConfig.PageSize + pageConfig.RecordUnit + " ");
            if (showTotalPage) _strBuilder.Append("" + pageConfig.CurrentPage + "頁/共" + pageConfig.TotalPage + "");
            //首頁鏈接
            if (pageConfig.CurrentPage > 1)
            {
                routeValues["page"] = 1;
                _strBuilder.Append("<a class=\"linkbtn\" href=\"" + _url.Action(actionName, controllerName, routeValues) + "\">首頁</a>");
            }
            else _strBuilder.Append("<span class=\"btn\">首頁</span>");
            //上一頁
            if (pageConfig.CurrentPage > 1)
            {
                routeValues["page"] = pageConfig.CurrentPage - 1;
                _strBuilder.Append("<a class=\"linkbtn\" href=\"" + _url.Action(actionName, controllerName, routeValues) + "\">上一頁</a>");
            }
            else _strBuilder.Append("<span class=\"btn\">上一頁</span>");
            //數字導航開始
            int _startPage, _endPage;
            //總頁數少於要顯示的頁數,頁碼全部顯示
            if (digitalLinkNum >= pageConfig.TotalPage) { _startPage = 1; _endPage = pageConfig.TotalPage; }
            else//顯示指定數量的頁碼
            {
                int _forward = (int)Math.Ceiling(digitalLinkNum / 2.0);
                if (pageConfig.CurrentPage > _forward)//起始頁碼大於1
                {
                    _endPage = pageConfig.CurrentPage + digitalLinkNum - _forward;
                    if (_endPage > pageConfig.TotalPage)//結束頁碼大於總頁碼結束頁碼為最后一頁
                    {
                        _startPage = pageConfig.TotalPage - digitalLinkNum;
                        _endPage = pageConfig.TotalPage;

                    }
                    else _startPage = pageConfig.CurrentPage - _forward;
                }
                else//起始頁碼從1開始
                {
                    _startPage = 1;
                    _endPage = digitalLinkNum;
                }
            }
            //向上…
            if (_startPage > 1)
            {
                routeValues["page"] = _startPage - 1;
                _strBuilder.Append("<a class=\"linkbatch\" href=\"" + _url.Action(actionName, controllerName, routeValues) + "\">…</a>");
            }
            //數字
            for (int i = _startPage; i <= _endPage; i++)
            {
                if (i != pageConfig.CurrentPage)
                {
                    routeValues["page"] = i;
                    _strBuilder.Append("<a class=\"linknum\" href=\"" + _url.Action(actionName, controllerName, routeValues) + "\">" + i.ToString() + "</a>");
                }
                else
                {
                    _strBuilder.Append("<span class='currentnum'>" + i.ToString() + "</span>");
                }
            }
            //向下…
            if (_endPage < pageConfig.TotalPage)
            {
                routeValues["page"] = _endPage + 1;
                _strBuilder.Append("<a class=\"linkbatch\" href=\"" + _url.Action(actionName, controllerName, routeValues) + "\">…</a>");
            }
            ////數字導航結束
            //下一頁和尾頁
            if (pageConfig.CurrentPage < pageConfig.TotalPage)
            {
                routeValues["page"] = pageConfig.CurrentPage + 1;
                _strBuilder.Append("<a class=\"linkbtn\" href=\"" + _url.Action(actionName, controllerName, routeValues) + "\">下一頁</a>");
                routeValues["page"] = pageConfig.TotalPage;
                _strBuilder.Append("<a class=\"linkbtn\" href=\"" + _url.Action(actionName, controllerName, routeValues) + "\">尾頁</a>");
            }
            else _strBuilder.Append("<span class=\"btn\">下一頁</span><span class=\"btn\">尾頁</span>");
            //顯示頁碼下拉框
            if (showSelect)
            {
                routeValues["page"] = "-nspageselecturl-";
                _strBuilder.Append(" 跳轉到第<select id=\"nspagerselect\" data-url=\"" + _url.Action(actionName, controllerName, routeValues) + "\">");
                for (int i = 1; i <= pageConfig.TotalPage; i++)
                {
                    if (i == pageConfig.CurrentPage) _strBuilder.Append("<option selected=\"selected\" value=\"" + i + "\">" + i + "</option>");
                    else _strBuilder.Append("<option value=\"" + i + "\">" + i + "</option>");
                }
                _strBuilder.Append("</select>頁");
                _strBuilder.Append("<script type=\"text/javascript\">$(\"#" + ctrlId + " #nspagerselect\").change(function () {$.post($(\"#" + ctrlId + " #nspagerselect\").attr(\"data-url\").replace(\"-nspageselecturl-\", $(\"#" + ctrlId + " #nspagerselect\").val()), function (data) {$(\"#" + ctnrId + "\").html(data);});});</script>");
            }
            //顯示頁碼輸入框
            if (showInput)
            {
                routeValues["page"] = "-nspagenumurl-";
                _strBuilder.Append(" 轉到第<input id=\"nspagernum\" type=\"text\" data-url=\"" + _url.Action(actionName, controllerName, routeValues) + "\" />頁");
                _strBuilder.Append("<script type=\"text/javascript\">$(\"#" + ctrlId + " #nspagernum\").keydown(function (event) {if (event.keyCode == 13) { $.post($(\"#" + ctrlId + " #nspagernum\").attr(\"data-url\").replace(\"-nspagenumurl-\", $(\"#" + ctrlId + " #nspagernum\").val()), function (data) {$(\"#" + ctnrId + "\").html(data);}); } });</script>");
            }
            _strBuilder.Append("<script type=\"text/javascript\">$(\"#" + ctrlId + " a\").click(function () {$.post($(this).attr(\"href\"), function (data) {$(\"#" + ctnrId + "\").html(data);});return false; });</script>");
            _strBuilder.Append("</div>");
            return MvcHtmlString.Create(_strBuilder.ToString());
        }

完工

===============

代碼包:http://pan.baidu.com/share/link?shareid=136687&uk=2198133459


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM