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

来源:互联网 发布:多益网络并购2017 编辑:程序博客网 时间:2024/06/05 03:22

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'  onkeyup='this.value=this.value.replace(/[^1-9]\d*$/,"")' value='@Request.QueryString["page"]' name='pageId' id='pageId'/>页      <!--     获取文本框的值作为跳转路径参数<a href="javascript:;" onclick="location ='?page='+document.getElementById('pageId').value;">跳 转</a>     -->    <a href="javascript:;" onclick="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))




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


原创粉丝点击