• MVC HtmlHelper扩展——实现分页功能


    MVC HtmlHelper扩展类(PagingHelper)

    using System;
    using System.Collections.Generic;
    using System.Collections.Specialized;
    using System.Linq;
    using System.Text;
    using System.Web;
    using System.Web.Mvc;
    using System.Web.Routing;
    
    namespace HtmlHelperMvc.Models
    {
        /// <summary>
        /// 分页类如果一个页面显示两个列表只需要复制该类到项目中重命名一个就可以
        /// </summary>
        public static class PagingHelper
        {
            #region 属性Property
            /// <summary>
            /// 当前页码
            /// </summary>
            private static int? _currentPage = null;
            /// <summary>
            /// 当前页码
            /// </summary>
            public static int CurrentPage
            {
                get
                {
                    return _currentPage ?? 1;
                }
                set
                {
                    _currentPage = value;
                }
            }
            /// <summary>
            /// 每页记录条数
            /// </summary>
            private static int? _pageSize = null;
            /// <summary>
            /// 每页记录条数
            /// </summary>
            public static int PageSize
            {
                get
                {
                    return _pageSize ?? 15;
                }
                set
                {
                    _pageSize = value;
                }
            }
            /// <summary>
            /// 是否显示上一页
            /// </summary>
            public static bool HasPreviousPage
            {
                get
                {
                    return (CurrentPage > 1);
                }
            }
            /// <summary>
            /// 是否显示下一页
            /// </summary>
            public static bool HasNextPage
            {
                get
                {
                    return (CurrentPage < TotalPages);
                }
            }
            /// <summary>
            /// 当前页:
            /// </summary>
            public static string CurrentPageDisplayName { get; set; }
            /// <summary>
            /// 每页显示:
            /// </summary>
            public static string PageSizeDisplayName { get; set; }
            public static string FirstDisplayName { get; set; }
            public static string PreDisplayName { get; set; }
            public static string NextDisplayName { get; set; }
            public static string LastDisplayName { get; set; }
            public static string TotalCountDisplayName { get; set; }
            public static string TotalPagesDisplayName { get; set; }
            /// <summary>
            /// 总条数
            /// </summary>
            public static int TotalCount
            {
                get;
                set;
            }
            public static int TotalPages
            {
                get
                {
                    return (int)Math.Ceiling(TotalCount / (double)PageSize);
                    //return (TotalCount % PageSize == 0 ? TotalCount / PageSize : TotalCount / PageSize + 1);
                }
            }
            /// <summary>
            /// 设置分页url eg:/Admin/Product/Index
            /// </summary>
            public static string PagingUrl
            {
                get;
                set;
            }
            /// <summary>
            /// 默认page,设置分页参数名 eg:/Admin/Product/Index?PagingParamName=1
            /// </summary>
            public static string PagingParamName
            {
                get;
                set;
            }
            #endregion
            #region Paging String
            /// <summary>
            /// MVC分页 如果用jquery分页只需要class不需要href,用以下实现:
            /// $(".class值").live("click", function () {
            /// var page = $(this).attr("pagingParamName值");
            /// $("#order").html("").load("/Customer/Order?page="+page);
            /// });live自动给遍历增加事件
            /// </summary>
            /// <param name="html"></param>
            /// <param name="htmlAttributes">new {@class="grey",pagingParamName="page",href="/Admin/Product/Index"} pagingParamName默认page,匿名类添加控件属性</param>
            /// <returns></returns>
            public static MvcHtmlString Paging(this System.Web.Mvc.HtmlHelper html, object htmlAttributes)
            {
                RouteValueDictionary values = new RouteValueDictionary(htmlAttributes);
                #region 属性赋值
                if (values["href"] != null)
                {
                    PagingUrl = values["href"].ToString();
                }
                if (values["pagingParamName"] != null)
                {
                    PagingParamName = values["pagingParamName"].ToString();
                    values.Remove("pagingParamName");
                }
                else
                {
                    PagingParamName = "page";
                }
                #endregion
                #region 分页最外层div/span
                TagBuilder builder = new TagBuilder("div");//span
                //创建Id,注意要先设置IdAttributeDotReplacement属性后再执行GenerateId方法. 
                //builder.IdAttributeDotReplacement = "_";
                //builder.GenerateId(id);
                //builder.AddCssClass("");
                //builder.MergeAttributes(values);
                builder.InnerHtml = PagingBuilder(values);
                #endregion
                return MvcHtmlString.Create(builder.ToString(TagRenderMode.Normal));//解决直接显示html标记
            }
            private static string PagingBuilder(RouteValueDictionary values)
            {
                #region 条件搜索时包括其他参数
                StringBuilder urlParameter = new StringBuilder();
                NameValueCollection collection = HttpContext.Current.Request.QueryString;
                string[] keys = collection.AllKeys;
                for (int i = 0; i < keys.Length; i++)
                {
                    if (keys[i].ToLower() != "page")
                    {
                        urlParameter.AppendFormat("&{0}={1}", keys[i], collection[keys[i]]);
                    }
                }
                #endregion
                //CurrentPage = Convert.ToInt32(HttpContext.Current.Request.QueryString["page"] ?? "0");
                StringBuilder sb = new StringBuilder();
                #region 分页统计
                sb.AppendFormat("Total &nbsp;{0} &nbsp; Records Page &nbsp;{1} of &nbsp;{2}  &nbsp; ", TotalCount, CurrentPage, TotalPages);
                #endregion
                #region 首页 上一页
                sb.AppendFormat(TagBuilder(values, 1, " First"));
                //sb.AppendFormat("<a href={0}?page=1{1}>First</a>&nbsp;",url,urlParameter);
                if (HasPreviousPage)
                {
                    sb.AppendFormat(TagBuilder(values, CurrentPage - 1, "   Prev   "));
                    //sb.AppendFormat("<a href={0}?page={1}{2}>Prev</a>&nbsp;", url, CurrentPage - 1, urlParameter);
                }
                #endregion
                #region 分页逻辑
                if (TotalPages > 10)
                {
                    if ((CurrentPage + 5) < TotalPages)
                    {
                        if (CurrentPage > 5)
                        {
                            for (int i = CurrentPage - 5; i <= CurrentPage + 5; i++)
                            {
                                sb.Append(TagBuilder(values, i, i.ToString()));
                            }
                        }
                        else
                        {
                            for (int i = 1; i <= 10; i++)
                            {
                                sb.Append(TagBuilder(values, i, i.ToString()));
                            }
                        }
                        sb.Append("...&nbsp;");
                    }
                    else
                    {
                        for (int i = CurrentPage - 10; i <= TotalPages; i++)
                        {
                            sb.Append(TagBuilder(values, i, i.ToString()));
                        }
                    }
                }
                else
                {
                    for (int i = 1; i <= TotalPages; i++)
                    {
                        sb.Append("&nbsp;" + TagBuilder(values, i, i.ToString()) + "&nbsp");
                    }
                }
                #endregion
                #region 下一页 末页
                if (HasNextPage)
                {
                    sb.AppendFormat(TagBuilder(values, CurrentPage + 1, "Next"));
                    //sb.AppendFormat("<a href={0}?page={1}{2}>Next</a>&nbsp;", url, CurrentPage + 1, urlParameter);
                }
                sb.AppendFormat(TagBuilder(values, TotalPages, "Last"));
                //sb.AppendFormat("<a href={0}?page={1}{2}>Last</a>",url,TotalPages,urlParameter);
                #endregion
                return sb.ToString();
            }
            private static string TagBuilder(RouteValueDictionary values, int i, string innerText)
            {
                values[PagingParamName] = i;
                TagBuilder tag = new TagBuilder("a");
                if (PagingUrl != null)
                {
                    values["href"] = PagingUrl + "?" + PagingParamName + "= " + i + "&nbsp;&nbsp;&nbsp;";
                }
                if (CurrentPage == i && innerText != " First" && innerText != " Last")
                {
                    values["id"] = "on";
                }
                else
                {
                    tag.Attributes["id"] = "";
                }
                tag.MergeAttributes(values);
                tag.SetInnerText(innerText);
                return tag.ToString();
            }
            #endregion
        }
    }

    后台Controller代码

    //
    // GET: /Home/
    
    public ActionResult Index(int? page)
    {
        page = page ?? 1;
        PagingHelper.CurrentPage = Convert.ToInt32(page);
        PagingHelper.PageSize = 20;
    
        //{获取数据集的中条数,以及分页的数据集}
    
        PagingHelper.TotalCount = 2000;
        return View();
    }

    前台页面代码

    @{
        ViewBag.Title = "Index";
    }
    @using HtmlHelperMvc.Models;
    <h2>Index</h2>
    <hr />
    <style type="text/css">
        #on
        {
            color: #FFF;
            background-color: #337AB7;
            border-color: #337AB7;
        }
    
        .pagination a
        {
            margin-right: 3px;
            padding: 5px 10px;
            font-size: 12px;
            text-decoration: none;
            background-color: #fff;
            border: 1px solid #ddd;
            cursor: pointer;
            display: inline-block;
            border-radius: 3px;
        }
    
        a
        {
            color: #337ab7;
            text-decoration: none;
        }
    
        a
        {
            background-color: transparent;
        }
    
        *
        {
            -webkit-box-sizing: border-box;
            -moz-box-sizing: border-box;
            box-sizing: border-box;
        }
    </style>
    <script src="~/Scripts/jquery-1.8.2.js"></script>
    <script type="text/javascript">
        $(function () {
            $(".pagination .active").live("click", function () {
                $("#page").val($(this).attr("page"));
                $("#form_Submit").submit();
            });
        });
    </script>
    <form id="form_Submit" action="/Home/Index" method="post">
        <div class="fix">
            <div class="page">
                <div class="pagination pagination-sm pull-right" id="pageDiv" style="margin: 0px 0;">
                    <input type="hidden" id="page" name="page" value="@PagingHelper.CurrentPage" />
                    @Html.Paging(new { @class = "active" })
                </div>
            </div>
        </div>
    </form>

    最终效果图:

  • 相关阅读:
    查找文件的绝对路径
    购买成都二手商品房交易流程(卖方存在欠银行贷款的情况)
    针对CCTV摄像头的扫描爆破工具 :Cameradar
    交换机的基本配置
    思科交换机和路由器的远程配置
    安装Windows和Ubuntu双系统--Ubuntu安装过程识别不了硬盘
    SpringBoot 配置
    Tomcat9在CentOS7上启动慢解决办法,实测可行
    Linux安装JDK
    电影分享——《小丑》
  • 原文地址:https://www.cnblogs.com/xiangyisheng/p/6814027.html
Copyright © 2020-2023  润新知