MVC分页详解(包括整个流程步骤,代码与注解)

4 篇文章 0 订阅

1、首先写一个Model(分页模型)MvcPagerInfo.cs(可放入AppCode中)

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

namespace community
{
    public class MvcPagerInfo
    {
        private int _pageIndex;
        public int PageIndex { get { return _pageIndex; } set { _pageIndex = value; } }

        private int _pageSize;
        public int PageSize { get { return _pageSize; } set { _pageSize = value; } }

        private int _recordCount;
        public int RecordCount { get { return _recordCount; } set { _recordCount = value; } }

        /// <summary>
        /// 当前状态下,最小的页码
        /// </summary>
        private int _lowPageNum;
        public int LowPageNum { get { return _lowPageNum; } }

        /// <summary>
        /// 当前状态下,最大的页码
        /// </summary>
        private int _highPageNum;
        public int HighPageNum { get { return _highPageNum; } }

        /// <summary>
        /// 一次性能显示多少页数
        /// </summary>
        private int _maxPageNum;
        public int MaxPageNum { get { return _maxPageNum; } set { _maxPageNum = value; } }

        private bool _showPageInfo = true;
        public bool ShowPageInfo { get { return _showPageInfo; } set { _showPageInfo = value; } }

        /// <summary>
        /// 页数
        /// </summary>
        private int _pageCount;
        public int PageCount { get { return _pageCount; } }

        /// <summary>
        /// 当前路径
        /// </summary>
        private string path;
        public string Path { get { return path; } set { path = value; } }


        private NameValueCollection queries;
        public MvcPagerInfo()
        {

        }

        public void Compose()
        {
            path = HttpContext.Current.Request.Url.AbsolutePath;
            queries = new NameValueCollection(StringComparer.OrdinalIgnoreCase);
            foreach (string key in HttpContext.Current.Request.QueryString.AllKeys)
            {
                if (key == null)
                    continue;
                if (key.ToLower() != "page")
                    queries.Add(key, HttpContext.Current.Request.QueryString[key]);
            }

            if (_recordCount == 0)
                _pageCount = 1;
            else
                _pageCount = (_recordCount % _pageSize == 0) ? (_recordCount / _pageSize) : ((_recordCount / _pageSize) + 1);


            if (_maxPageNum >= _pageCount)//如果页数小于等于最大页面显示
            {
                _lowPageNum = 1;
                _highPageNum = _pageCount;
            }
            else
            {
                int lhalf, rhalf;
                if (_maxPageNum % 2 == 0)
                {
                    lhalf = _maxPageNum / 2 - 1;
                    rhalf = _maxPageNum / 2;
                }
                else
                    lhalf = rhalf = _maxPageNum / 2;
                _lowPageNum = (_pageIndex - lhalf > 0) ? (_pageIndex - lhalf) : 1;
                _highPageNum = (_pageIndex + rhalf > _pageCount) ? _pageCount : (_pageIndex + rhalf < _maxPageNum ? _maxPageNum : _pageIndex + rhalf);
                if (_lowPageNum > 1 && _highPageNum - _lowPageNum < _maxPageNum - 1)//校正
                {
                    _lowPageNum = _highPageNum - _maxPageNum + 1;
                }
            }
        }

        public string GetFirstUrl()
        {
            return GenerateUrl(1);
        }

        public string GetLastUrl()
        {
            return GenerateUrl(_pageCount);
        }

        public string GetNextUrl()
        {
            return GenerateUrl(_pageIndex + 1);
        }

        public string GetPrevUrl()
        {
            return GenerateUrl(_pageIndex - 1);
        }

        public string GetCurrentUrl()
        {
            return GenerateUrl(_pageIndex);
        }

        public string GetUrl(int page)
        {
            return GenerateUrl(page);
        }

        private string GenerateUrl(int pageIndex)
        {
            StringBuilder sb = new StringBuilder();
            foreach (string key in queries.AllKeys)
            {
                sb.Append(key + "=" + System.Web.HttpContext.Current.Server.UrlEncode(queries[key]) + "&");
            }
            sb.Append("page=" + pageIndex);
            return path + "?" + sb.ToString();
        }

        public string GetPageInfo()
        {
            if (_showPageInfo)
            {
                string info = "共{0}条 第{4}条-{5}条 第{1}页/共{2}页 每页{3}条";
                int startCurrentCount = (_pageIndex - 1) * _pageSize + 1;
                int endCurrentCount = _pageIndex * _pageSize;
                if (startCurrentCount > _recordCount)
                    startCurrentCount = _recordCount;
                if (endCurrentCount > _recordCount)
                    endCurrentCount = _recordCount;

                info = string.Format(info, _recordCount.ToString(), _pageIndex.ToString(), _pageCount.ToString(), _pageSize.ToString(), startCurrentCount.ToString(), endCurrentCount.ToString());
                return info;
            }
            else
                return "";
        }
    }
}

2、在控制器公用方法中添加分页方法BaseController.cs

       #region fs 分页
        protected int GetPageSize()
        {
            if (string.IsNullOrEmpty(Request.QueryString["pagesize"]))
                return 10;
            else
                return Convert.ToInt32(Request.QueryString["pagesize"]);
        }

        protected int GetPageIndex()
        {
            if (string.IsNullOrEmpty(Request.QueryString["page"]))
            {
                if (string.IsNullOrEmpty(Request.QueryString["pageindex"]))
                    return 1;
                else
                    return Convert.ToInt32(Request.QueryString["pageindex"]);
            }
            else
                return Convert.ToInt32(Request.QueryString["page"]);
        }

        protected void AddPager(int recordCount, int PageSize)
        {
            AddPager(recordCount, false, PageSize);
        }

        protected void AddPager(int recordCount)
        {
            AddPager(recordCount, false);
        }

        protected void AddPager(int recordCount, bool showpageInfo)
        {
            AddPager(recordCount, showpageInfo, GetPageSize());
        }

        protected void AddPager(int recordCount, bool showpageInfo, int pageSize)
        {
            MvcPagerInfo pageinfo = new MvcPagerInfo();
            pageinfo.PageIndex = GetPageIndex();
            pageinfo.PageSize = pageSize;
            pageinfo.RecordCount = recordCount;
            pageinfo.MaxPageNum = 10;
            pageinfo.Compose();
            pageinfo.ShowPageInfo = showpageInfo;
            ViewData.Add("pager", pageinfo);
        }

        /// <summary>
        /// 是否列表要获取所有数据
        /// </summary>
        /// <returns></returns>
        protected bool IsGetTotalData()
        {
            string total = Request.QueryString["total"];
            if (total == "1" || this.GetPageSize() <= 0)
                return true;
            else
                return false;

        }

        /// <summary>
        /// 保存访问地址
        /// </summary>
        /// <param name="pageName"></param>
        protected void SaveCurrentUrl(string pageName)
        {
            Session[pageName] = Request.Url.ToString();
        }

        /// <summary>
        /// 获取访问地址
        /// </summary>
        /// <param name="pageName"></param>
        protected string GetLastSavedUrl(string pageName)
        {
            if (Session[pageName] != null)
                return Session[pageName].ToString();
            else
                return pageName;
        }
        #endregion

3、写一个一般处理程序Pager.ascx

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<MvcPagerInfo>" %>
<%@ Import Namespace="community" %>
<%
    string firstPage;
    string prevPage;
    string nextPage;
    string lastPage;
   // string currentPage;
    if (Model != null && Model.RecordCount != 0)
    {
        firstPage = "<a id='firstPage' href=\"" + Model.GetFirstUrl() + "\">首页</a>";
        lastPage = "<a href=\"" + Model.GetLastUrl() + "\">末页</a>";
        if (Model.PageIndex == 1 || Model.PageCount < Model.PageIndex)
        {
            prevPage = "<span>上一页</span>";
        }
        else
        {
            prevPage = "<a href=\"" + Model.GetPrevUrl() + "\">上一页</a>";
        }

        if (Model.PageCount <= Model.PageIndex)
        {
            nextPage = "<span>下一页</span>";
        }
        else
        {
            nextPage = "<a href=\"" + Model.GetNextUrl() + "\">下一页</a>";
        }
        Response.Write("<span>" + Model.GetPageInfo() + "</span>");
        Response.Write(firstPage);
        Response.Write(prevPage);

        for (int i = Model.LowPageNum; i <= Model.HighPageNum; i++)
        {
            string css = "";
            if (Model.PageIndex == i)
                css = " class=\"currentPage\"";
            Response.Write("<a href=\"" + Model.GetUrl(i) + "\"" + css + ">" + i + "</a>");
        }

        if (Model.HighPageNum < Model.PageCount)
            Response.Write("<a href=\"" + Model.GetUrl(Model.HighPageNum + 1) + "\">...</a>");

        Response.Write(nextPage);
        Response.Write(lastPage);
    }
   
 %>

4、分页模板 _Pager.cshtml(View/Shared中)

<div id="pagelist" class="pagelist">
    @{ Html.RenderPartial("Pager", ViewData["pager"]);} 
    <input type='text'  style='width:30px'  οnkeyup='this.value=this.value.replace(/[^1-9]\d*$/,"")' value='@Request.QueryString["page"]' name='pageId' id='pageId'/>页 
     <!--
     获取文本框的值作为跳转路径参数<a href="javascript:;" οnclick="location ='?page='+document.getElementById('pageId').value;">跳 转</a>
     -->
    <a href="javascript:;" οnclick="url()">跳 转</a>
</div>
<script type="text/javascript">
    window.onload = function () {
        if (!document.getElementById('firstPage')) {
            document.getElementById("pagelist").style.display = "none";
        }
        if (document.getElementById('pageId').value == "") {
            document.getElementById('pageId').value = 1;
        }
    }
    function url() {
        var str = document.getElementById("firstPage").getAttribute("href");
        str=str.replace("page=1", "page=" + document.getElementById('pageId').value);
        location.href = str;
    }
</script>

5、View(视图),以后分页调用这个模板就好了

 @{Html.RenderPartial("_Pager");}<!--将其放入需要分页的位置-->

6、CSS,分页在右下角显示

/*分页*/
.pagelist { text-align:right; padding:5px; color:#000; cursor:default;height: 31px;}
.pagelist a:link,.pagelist a:visited, .pagelist span{padding: 1px 3px 1px 3px;margin: 2px;text-decoration: none;min-width:12px;text-align:center;color:#2b5591;}
.pagelist a:hover{ background-color:#dedede}
.pagelist span{ color:#999}
.pagelist .currentPage{ font-weight:bold; color:red;}
.pagelist .txt{ width:25px}

7、Controller(控制器中)

        public ActionResult View()
        {
              int total = 0;
              int pageIndex = GetPageIndex();//当前页码
              int pageSize = GetPageSize();//使用默认,每页10条数据
              var model = BlogService.LoadLastestBrieves(pageSize, pageIndex, out total);//调用的方法
              int totalCount = BlogService.TotalBlogs();//获取分页时数据总条数
              AddPager(totalCount, true, pageSize);//分页时每页显示10条数据,页面显示“info = "共{0}条 第{4}条-{5}条 第{1}页/共{2}页 每页{3}条"",false则隐藏
              SaveCurrentUrl("~/Admin/View");//保存当前路径,在AdminController中View下
              return View(model);
        }

8、单纯SQL语句分页,当然你也可以用存储过程进行分页

select * from (select *,ROW_NUMBER() over(order by ID) as rn from UserInfo where ...) where rn between @PageSize*(@PageIndex-1)+1 and @PageSize*@PageIndex

9、结果(http://localhost:XXXX/Admin/View中)

默认结果:(AddPager(totalCount))


详细结果:(AddPager(totalCount,true))




一个人的牛逼不如一群人的傻逼


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值