Asp.Net Mvc 分页

  1. 后台Web新建文件夹HtmlExtensions,在此文件夹下新建类HtmlHelperPaginationExtensions

    namespace CPS.Mvc//此片命名空间很重要
    {
        /// <summary>
        /// 分页按钮控件
        /// </summary>
        public static class HtmlHelperPaginationExtensions
        {
            /// <summary>
            /// 呈现普通分页按钮
            /// </summary>
            /// <param name="paginationMode">分页按钮显示模式</param>
            /// <param name="html">被扩展的HtmlHelper</param>
            /// <param name="pagingDataSet">数据集</param>
            /// <param name="numericPagingButtonCount">数字分页按钮显示个数</param>
            /// <returns>分页按钮html代码</returns>
            public static MvcHtmlString PagingButton(this HtmlHelper html, CPS.Model.IPagingDataSet pagingDataSet, PaginationMode paginationMode = PaginationMode.NumericNextPrevious, int numericPagingButtonCount = 7)
            {
                return PagingButton(html, pagingDataSet, false, null, paginationMode, numericPagingButtonCount);
            }
    
            /// <summary>
            /// 呈现异步分页按钮
            /// </summary>
            /// <param name="paginationMode">分页按钮显示模式</param>
            /// <param name="html">被扩展的HtmlHelper</param>
            /// <param name="pagingDataSet">数据集</param>
            /// <param name="updateTargetId">异步分页时,被更新的目标元素Id</param>
            /// <param name="numericPagingButtonCount">数字分页按钮显示个数</param>
            /// <returns>分页按钮html代码</returns>
            public static MvcHtmlString AjaxPagingButton(this HtmlHelper html, CPS.Model.IPagingDataSet pagingDataSet, string updateTargetId, PaginationMode paginationMode = PaginationMode.NumericNextPrevious, int numericPagingButtonCount = 7, string ajaxUrl = null)
            {
                return PagingButton(html, pagingDataSet, true, updateTargetId, paginationMode, numericPagingButtonCount, ajaxUrl);
            }
    
            /// <summary>
            /// 呈现分页按钮
            /// </summary>
            /// <param name="html">被扩展的HtmlHelper</param>
            /// <param name="pagingDataSet">数据集</param>
            /// <param name="updateTargetId">异步分页时,被更新的目标元素Id</param>
            /// <param name="paginationMode">分页按钮显示模式</param>
            /// <param name="numericPagingButtonCount">数字分页按钮显示个数</param>
            /// <param name="enableAjax">是否使用ajax分页</param>
            /// <returns>分页按钮html代码</returns>
            private static MvcHtmlString PagingButton(this HtmlHelper html, CPS.Model.IPagingDataSet pagingDataSet, bool enableAjax, string updateTargetId, PaginationMode paginationMode = PaginationMode.NumericNextPrevious, int numericPagingButtonCount = 7, string ajaxUrl = null)
            {
                if (pagingDataSet.TotalRecords == 0 || pagingDataSet.PageSize == 0)
                    return MvcHtmlString.Empty;
    
                //计算总页数
                int totalPages = (int)(pagingDataSet.TotalRecords / (long)pagingDataSet.PageSize);
                if ((pagingDataSet.TotalRecords % pagingDataSet.PageSize) > 0)
                    totalPages++;
    
                //未超过一页时不显示分页按钮
                if (totalPages <= 1)
                    return MvcHtmlString.Empty;
    
                bool showFirst = false;
                if (paginationMode == PaginationMode.NextPreviousFirstLast)
                    showFirst = true;
    
                bool showLast = false;
                if (paginationMode == PaginationMode.NextPreviousFirstLast)
                    showLast = true;
    
                bool showPrevious = true;
                //if (paginationMode == PaginationMode.NextPrevious || paginationMode == PaginationMode.NextPreviousFirstLast || paginationMode == PaginationMode.NumericNextPrevious)
                //    showPrevious = true;
    
                bool showNext = true;
                //if (paginationMode == PaginationMode.NextPrevious || paginationMode == PaginationMode.NextPreviousFirstLast || paginationMode == PaginationMode.NumericNextPrevious)
                //    showNext = true;
    
                bool showNumeric = false;
                if (paginationMode == PaginationMode.NumericNextPrevious)
                    showNumeric = true;
    
                //显示多少个数字分页按钮
                //int numericPageButtonCount = 10;
    
                //对pageIndex进行修正
                if ((pagingDataSet.PageIndex < 1) || (pagingDataSet.PageIndex > totalPages))
                    pagingDataSet.PageIndex = 1;
    
                string pagingContainer = "<div class=\"dataTables_paginate paging_full_numbers\"";
                if (enableAjax)
                    pagingContainer += " plugin=\"ajaxPagingButton\" data=\"" + HttpUtility.HtmlEncode(Json.Encode(new { updateTargetId = updateTargetId })) + "\"";
                pagingContainer += ">";
    
                StringBuilder pagingButtonsHtml = new StringBuilder(pagingContainer);
    
                //构建 "首页"
                if (showFirst)
                {
                    if ((pagingDataSet.PageIndex > 1) && (totalPages > numericPagingButtonCount))
                    {
                        pagingButtonsHtml.AppendLine();
                        pagingButtonsHtml.AppendFormat(BuildLink("&lt;&lt;", GetPagingNavigateUrl(html, 1, ajaxUrl), "paginate_button first"));
                    }
                    else if (paginationMode == PaginationMode.NextPreviousFirstLast)
                    {
                        pagingButtonsHtml.AppendLine();
                        if (pagingDataSet.PageIndex > 1)
                        {
                            pagingButtonsHtml.AppendFormat(BuildLink("&lt;&lt;", GetPagingNavigateUrl(html, 1, ajaxUrl), "paginate_button first"));
                        }
                        else
                        {
                            pagingButtonsHtml.AppendFormat("<a class=\"paginate_button first\">{0}</a>", "&lt;&lt;");
                        }
                    }
                }
    
    
                //构建 "上一页"
                if (showPrevious)
                {
                    pagingButtonsHtml.AppendLine();
                    if (pagingDataSet.PageIndex == 1)
                        pagingButtonsHtml.AppendFormat("<a class=\"paginate_button previous\">{0}</a>", "上一页");
                    else
                        pagingButtonsHtml.AppendFormat(BuildLink("上一页", GetPagingNavigateUrl(html, pagingDataSet.PageIndex - 1, ajaxUrl), "paginate_button previous"));
                }
    
                //构建 数字分页部分
                if (showNumeric)
                {
                    pagingButtonsHtml.Append("<span>");
                    int startNumericPageIndex;
                    if (numericPagingButtonCount > totalPages || pagingDataSet.PageIndex - (numericPagingButtonCount / 2) <= 0)
                        startNumericPageIndex = 1;
                    else if (pagingDataSet.PageIndex + (numericPagingButtonCount / 2) > totalPages)
                        startNumericPageIndex = totalPages - numericPagingButtonCount + 1;
                    else
                        startNumericPageIndex = pagingDataSet.PageIndex - (numericPagingButtonCount / 2);
    
                    if (startNumericPageIndex < 1)
                        startNumericPageIndex = 1;
    
                    int lastNumericPageIndex = startNumericPageIndex + numericPagingButtonCount - 1;
                    if (lastNumericPageIndex > totalPages)
                        lastNumericPageIndex = totalPages;
    
                    if (startNumericPageIndex > 1)
                    {
                        for (int i = 1; i < startNumericPageIndex; i++)
                        {
                            pagingButtonsHtml.AppendLine();
    
                            if (i > 3)
                                break;
                            if (i == 3)
                                pagingButtonsHtml.Append("<a class=\"paginate_button disabled\">...</a>");
                            else
                            {
                                if (pagingDataSet.PageIndex == i)
                                    pagingButtonsHtml.AppendFormat("<a class=\"paginate_button current\">{0}</a>", i);
                                else
                                    pagingButtonsHtml.AppendFormat(BuildLink(i.ToString(), GetPagingNavigateUrl(html, i, ajaxUrl)));
                            }
                        }
                    }
    
                    for (int i = startNumericPageIndex; i <= lastNumericPageIndex; i++)
                    {
                        pagingButtonsHtml.AppendLine();
                        if (pagingDataSet.PageIndex == i)
                            pagingButtonsHtml.AppendFormat("<a class=\"paginate_button current\">{0}</a>", i);
                        else
                            pagingButtonsHtml.AppendFormat(BuildLink(i.ToString(), GetPagingNavigateUrl(html, i, ajaxUrl)));
                    }
    
                    if (lastNumericPageIndex < totalPages)
                    {
                        int lastStart = lastNumericPageIndex + 1;
                        if (totalPages - lastStart > 2)
                            lastStart = totalPages - 2;
    
                        for (int i = lastStart; i <= totalPages; i++)
                        {
                            pagingButtonsHtml.AppendLine();
                            if ((i == lastStart) && (totalPages - lastNumericPageIndex > 3))
                            {
                                pagingButtonsHtml.AppendLine();
                                pagingButtonsHtml.Append("<a class=\"paginate_button disabled\">...</a>");
                                continue;
                            }
    
                            if (pagingDataSet.PageIndex == i)
                                pagingButtonsHtml.AppendFormat("<a class=\"paginate_button current\">{0}</a>", i);
                            else
                                pagingButtonsHtml.AppendFormat(BuildLink(i.ToString(), GetPagingNavigateUrl(html, i, ajaxUrl)));
                        }
                    }
    
                    pagingButtonsHtml.Append("</span>");
                }
    
                if (showNext)
                {
                    pagingButtonsHtml.AppendLine();
                    if (pagingDataSet.PageIndex == totalPages)
                        pagingButtonsHtml.AppendFormat("<a class=\"paginate_button next\">{0}</a>", "下一页");
                    else
                        pagingButtonsHtml.AppendFormat(BuildLink("下一页", GetPagingNavigateUrl(html, pagingDataSet.PageIndex + 1, ajaxUrl), "paginate_button next"));
                }
    
                if (showLast)
                {
                    if ((pagingDataSet.PageIndex < totalPages) && (totalPages > numericPagingButtonCount))
                    {
                        pagingButtonsHtml.AppendLine();
                        pagingButtonsHtml.AppendFormat(BuildLink("&gt;&gt;", GetPagingNavigateUrl(html, totalPages, ajaxUrl), "paginate_button last"));
                    }
                    else if (paginationMode == PaginationMode.NextPreviousFirstLast)
                    {
                        pagingButtonsHtml.AppendLine();
                        if (pagingDataSet.PageIndex < totalPages)
                        {
                            pagingButtonsHtml.AppendFormat(BuildLink("&gt;&gt;", GetPagingNavigateUrl(html, totalPages, ajaxUrl), "paginate_button last"));
                        }
                        else
                        {
                            pagingButtonsHtml.AppendFormat("<a class=\"paginate_button last\">{0}</a>", "&gt;&gt;");
                        }
                    }
                }
                pagingButtonsHtml.Append("</div>");
                return MvcHtmlString.Create(pagingButtonsHtml.ToString());
            }
    
            /// <summary>
            /// 构建分页按钮的链接
            /// </summary>
            /// <param name="htmlHelper">被扩展的HtmlHelper</param>
            /// <param name="pageIndex">当前页码</param>
            /// <returns>分页按钮的url字符串</returns>
            public static string GetPagingNavigateUrl(this HtmlHelper htmlHelper, int pageIndex, string currentUrl = null)
            {
                object pageIndexObj = null;
                if (htmlHelper.ViewContext.RouteData.Values.TryGetValue("pageIndex", out pageIndexObj))
                {
                    htmlHelper.ViewContext.RouteData.Values["pageIndex"] = pageIndex;
                    return UrlHelper.GenerateUrl(null, null, null, htmlHelper.ViewContext.RouteData.Values, RouteTable.Routes, htmlHelper.ViewContext.RequestContext, true);
                }
    
                if (string.IsNullOrEmpty(currentUrl))
                    currentUrl = HttpUtility.HtmlEncode(htmlHelper.ViewContext.HttpContext.Request.RawUrl);
    
                if (currentUrl.IndexOf("?") == -1)
                {
                    return currentUrl + string.Format("?pageIndex={0}", pageIndex);
                }
                else
                {
                    if (currentUrl.IndexOf("pageIndex=", StringComparison.InvariantCultureIgnoreCase) == -1)
                        return currentUrl + string.Format("&pageIndex={0}", pageIndex);
                    else
                        return Regex.Replace(currentUrl, @"pageIndex=(\d+\.?\d*|\.\d+)", "pageIndex=" + pageIndex, RegexOptions.IgnoreCase | RegexOptions.Compiled);
                }
            }
    
            /// <summary>
            /// 生成带Href的链接
            /// </summary>
            private static string BuildLink(string linkText, string url, string cssClassName = "paginate_button")
            {
                return string.Format("<a href=\"{0}\" {1}>{2}</a>", url, string.IsNullOrEmpty(cssClassName) ? string.Empty : string.Format("class=\"{0}\"", cssClassName), linkText);
            }
    
    
    
        }
        /// <summary>
        /// 分页按钮显示模式
        /// </summary>
        public enum PaginationMode
        {
            /// <summary>
            /// 上一页/下一页 模式
            /// </summary>
            NextPrevious,
    
            /// <summary>
            /// 首页/末页/上一页/下一页 模式
            /// </summary>
            NextPreviousFirstLast,
    
            /// <summary>
            /// 上一页/下一页 + 数字 模式,例如: 上一页 1 2 3 4 5 下一页
            /// </summary>
            NumericNextPrevious,
        }
    
    }
  2.  在Model下新建文件夹PagingDataSet,然后在文件夹下新建接口IPagingDataSet、类PagingDataSet
    /// <summary>
        /// 可分页数据接口
        /// </summary>
        public interface IPagingDataSet
        {
            /// <summary>
            /// 当前页索引
            /// </summary>
            int PageIndex { get; set; }
            /// <summary>
            /// 每页显示记录数
            /// </summary>
            int PageSize { get; set; }
            /// <summary>
            /// 总记录数
            /// </summary>
            long TotalRecords { get; set; }
        }
    /// <summary>
        /// 分页数据封装
        /// </summary>
        /// <typeparam name="T">分页数据的实体类型</typeparam>
        [Serializable]
        public class PagingDataSet<T> : ReadOnlyCollection<T>, IPagingDataSet
        {
            /// <summary>
            /// 构造函数
            /// </summary>
            /// <param name="entities">用于分页的实体集合</param>
            public PagingDataSet(IList<T> entities)
                : base(entities)
            {
                PageSize = 20;
                PageIndex = 1;
            }
    
            public PagingDataSet(IEnumerable<T> entitys)
                : base(entitys.ToList<T>())
            {
                PageSize = 20;
                PageIndex = 1;
            }
    
            /// <summary>
            /// 页数
            /// </summary>
            public int PageCount
            {
                get
                {
                    long _pagecount = TotalRecords / Convert.ToInt64(PageSize);
                    if (TotalRecords % PageSize > 0)
                    {
                        _pagecount++;
                    }
    
                    return Convert.ToInt32(_pagecount);
                }
            }
    
            /// <summary>
            /// 当前页数
            /// </summary>
            public int PageIndex { get; set; }
    
            /// <summary>
            /// 每页显示记录数
            /// </summary>
            public int PageSize { get; set; }
    
            /// <summary>
            /// 搜索执行时间(秒)
            /// </summary>
            public double QueryDuration { get; set; }
    
            /// <summary>
            /// 总记录数
            /// </summary>
            public long TotalRecords { get; set; }
        }

     
  3. 在Views文件夹下找到web.config文件,在<system.web.webPages.razor><pages><namespaces>添加
    <add namespace="CPS.Mvc" />,注:此名称就是HtmlHelper扩展类的包名,也就是文章开关类中的包名。
  4. 在Controller中使用分页
    System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch(); //实例化一个计时器  
                watch.Start();//开始计时
                int maxcount = 0;
                if (PageIndex == null || PageIndex <= 1)
                    PageIndex = 1;
    
                 //此处分页获取数据
                 List<object> list = new Bll().GetListByPage(model,PageIndex,PageSize,out maxCount);
                
                Model.PagingDataSet<object> dataSet = new PagingDataSet<object>(list);
                dataSet.TotalRecords = maxcount;
                dataSet.PageIndex = (int)PageIndex;
                dataSet.PageSize = PageSize;
                watch.Stop();//结束计时  
                //获取当前实例测量得出的总运行时间(以毫秒为单位)  
                dataSet.QueryDuration = watch.ElapsedMilliseconds;
                return View(dataSet);
  5. 页面上引入PagingDataSet,然后在需要显示分页的地方添加控件
    @*头部引用*@
    @model Model.PagingDataSet<object>
    
    @*在需要显示分页的地方添加*@
    <div class="dataTables_paginate paging_full_numbers">
        @Html.PagingButton(Model, CPS.Mvc.PaginationMode.NumericNextPrevious, 7)
    </div>

     

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值