zoukankan      html  css  js  c++  java
  • 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>

    最终效果图:

  • 相关阅读:
    使用脚本改变树控件的行为 (转)点文本 收..
    (面包屑)SiteMapPath控件简化Web网站导航 (转)
    Web.config详解(转)
    SiteMap(站点地图)示例(转)
    url传递中文的解决方案总结(转)
    INI文件编程,WINAPI函数WritePrivateProfileString,GetPrivateProfileString(转帖)
    hdu 2708
    hdu 1709
    hdu 1045
    hdu 2714
  • 原文地址:https://www.cnblogs.com/xiangyisheng/p/6814027.html
Copyright © 2011-2022 走看看