文章出處

我之前就已經實現了ASP.NET MVC分頁(查看該博文),但它有局限性,必須確保在同一個視圖中只能有一處分頁,若需要在同一個視圖中設置多個分頁,卻無能為力,為此,我重新對原先的代碼進行了優化,增加了更為靈活的配置屬性及生成規則,解決了上述問題,代碼如下:

一、PageInfo類


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
 
namespace ROIS.Models
{
    /// <summary>
    /// 分頁信息
    /// </summary>
    public class PageInfo
    {
        private int _RecordCount = 0;
        private int _PageSize = 10;
        private int _CurrentPageNo = 1;
        private string _PageNoCtrlName = "_pageno";
        private bool _CreateScript = true;
        /// <summary>
        /// 獲取或設置記錄總數
        /// </summary>
        public int RecordCount
        {
            get
            {
                return _RecordCount;
            }
            set
            {
                if (value > 0)
                {
                    _RecordCount = value;
                }
            }
        }
 
        /// <summary>
        /// 獲取或設置每頁記錄數
        /// </summary>
        public int PageSize
        {
            get
            {
                return _PageSize;
            }
            set
            {
                if (value > 0)
                {
                    _PageSize = value;
                }
            }
        }
 
        /// <summary>
        /// 獲取或設置當前索引頁碼(從1開始計算)
        /// </summary>
        public int CurrentPageNo
        {
            get
            {
                return _CurrentPageNo;
            }
 
            set
            {
                if (value > 0)
                {
                    if (value > this.PageCount)
                    {
                        _CurrentPageNo = this.PageCount;
                    }
                    else
                    {
                        _CurrentPageNo = value;
                    }
                }
            }
        }
 
        /// <summary>
        /// 獲取總頁數
        /// </summary>
        public int PageCount
        {
            get
            {
                if (this.RecordCount <= 0)
                {
                    return 1;
                }
 
                return this.RecordCount / this.PageSize + (this.RecordCount % this.PageSize > 0 ? 1 : 0);
            }
        }
 
 
        /// <summary>
        /// 獲取或設置保存頁碼的控件名稱
        /// </summary>
        public string PageNoCtrlName
        {
            get
            {
                return _PageNoCtrlName;
            }
            set
            {
                if (!string.IsNullOrEmpty(value))
                {
                    _PageNoCtrlName = value;
                }
            }
        }
 
        /// <summary>
        /// 是否需要創建腳本函數
        /// </summary>
        public bool CreateScript
        {
            get { return _CreateScript; }
            set { _CreateScript = value; }
        }
 
        public PageInfo()
        { }
 
        public PageInfo(int recordCount, int currentPageNo, int pageSize = 10, string pageNoCtrlName = null, bool createScript = true)
        {
            this.RecordCount = recordCount;
            this.PageSize = pageSize;
            this.CurrentPageNo = currentPageNo;
            this.PageNoCtrlName = pageNoCtrlName;
            this.CreateScript = createScript;
        }
 
 
        /// <summary>
        /// 是否為首頁
        /// </summary>
        /// <returns></returns>
        public bool IsFirstPage()
        {
            return (this.CurrentPageNo <= 1);
        }
 
 
        /// <summary>
        /// 是否為末頁
        /// </summary>
        /// <returns></returns>
        public bool IsLastPage()
        {
            return (this.CurrentPageNo >= this.PageCount);
        }
 
    }
}

二、_Pager局部視圖(建議放在Shared目錄下)


@using ROIS.Models;
@model PageInfo
 
@if (Model!=null && Model.RecordCount > 0)
{           
<div class="pager">
    第@(Model.CurrentPageNo) 頁&nbsp;/&nbsp;共@(@Model.PageCount)頁,
@if (Model.IsFirstPage())
{
    <span>|&lt;首&nbsp;&nbsp;頁</span>
    <span>&lt;上一頁</span>
}
else
{
    <a href="javascript:turnPage(1,"@Model.PageNoCtrlName");">|&lt;首&nbsp;&nbsp;頁</a>
    <a href="javascript:turnPage(@(Model.CurrentPageNo-1),"@Model.PageNoCtrlName");">&lt;上一頁</a>
}
@if (Model.IsLastPage())
{
    <span>下一頁&gt;</span>
    <span>末&nbsp;&nbsp;頁&gt;|</span>
}
else
{
     <a href="javascript:turnPage(@(Model.CurrentPageNo+1),"@Model.PageNoCtrlName");">下一頁&gt;</a>
     <a href="javascript:turnPage(@Model.PageCount,"@Model.PageNoCtrlName");">末&nbsp;&nbsp;頁&gt;|</a>
}
轉到:
<select id="pages" onchange="javascript:turnPage(this.value,"@Model.PageNoCtrlName");">
    @for (int i = 1; i <= Model.PageCount; i++)
    {
        if (Model.CurrentPageNo == i)
        {
        <option value="@i" selected="selected">第@(i)頁</option>
        }
        else
        {
        <option value="@i">第@(i)頁</option>
        }
    }
</select>
<input type="hidden" id="@Model.PageNoCtrlName" name="@Model.PageNoCtrlName" />
</div>
if(Model.CreateScript)
{
<script type="text/javascript">
<!--
    function turnPage(pageNo,ctrlId) {
 
        var oPageNo = document.getElementById(ctrlId);
        oPageNo.value = pageNo;
        oPageNo.form.submit();
    }
 
    function getForm(obj) {
        if (obj.parentNode.nodeName.toLowerCase() == "form") {
            return obj.parentNode;
        } else {
            getForm(obj.parentNode);
        }
    }
//-->
</script>
}
 
}

三、使用方法:后臺Controller的Action中加入:

string pageNo = Request.Form["_pageno"];
                int iPageNo = 1;
                int.TryParse(pageNo, out iPageNo);
                PageInfo pageInfo = new PageInfo(detailList.Count(), iPageNo, 30, "_pageno", false);
ViewBag.PageInfo = pageInfo;
 
pageNo = Request.Form["_pageno2"];
                iPageNo = 1;
                int.TryParse(pageNo, out iPageNo);
                PageInfo pageInfo2 = new PageInfo(detailList2.Count(), iPageNo, 30, "_pageno2",true);
ViewBag.PageInfo2 = pageInfo2;

前臺VIEW頁面代碼如下:(注: ROIS是我專案名稱,依實際情況更換)

@Html.Partial("_Pager", ViewBag.PageInfo as ROIS.Models.PageInfo)
 
@Html.Partial("_Pager", ViewBag.PageInfo2 as ROIS.Models.PageInfo)
 
 

文章同步發表于我的個人網站:http://www.zuowenjun.cn/post/2014/10/23/65.html


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()