/// <summary>
        /// 生成分页链接Url
        /// </summary>
        /// <param name="htmlHelper">HtmlHelper</param>
        /// <param name="page">页码</param>
        /// <param name="options">配置</param>
        /// <returns></returns>
        internal static string GeneratePaginationUrl(this HtmlHelper htmlHelper, long page, BootstrapPagedButtonOptions options)
        {
            if (!htmlHelper.ViewContext.IsChildAction && htmlHelper.ViewContext.RouteData.Values.TryGetValue("page", out object pageIndexObj))
            {
                htmlHelper.ViewContext.RouteData.Values["page"] = page;

                return(UrlHelper.GenerateUrl(options.RouteName, options.ActionName, options.ControllerName, htmlHelper.ViewContext.RouteData.Values, RouteTable.Routes, htmlHelper.ViewContext.RequestContext, false));
            }

            var currentUrl = htmlHelper.ViewContext.RequestContext.HttpContext.Server.HtmlEncode(htmlHelper.ViewContext.HttpContext.Request.RawUrl);

            if (currentUrl.IndexOf("?") == -1)
            {
                return(string.Format("{0}?page={1}", currentUrl, page));
            }

            if (currentUrl.IndexOf("page=", StringComparison.InvariantCultureIgnoreCase) == -1)
            {
                return(string.Format("{0}&page={1}", currentUrl, page));
            }
            return(Regex.Replace(currentUrl, @"page=(\d+\.?\d*|\.\d+)", $"page={page}", RegexOptions.IgnoreCase | RegexOptions.Compiled));
        }
        internal static void GeneratePageButton(this HtmlHelper htmlHelper,
                                                TagBuilder pageBuilder,
                                                bool canClick, long page, string text, BootstrapPagedButtonOptions options, bool current = false)
        {
            TagBuilder liTag = new TagBuilder("li");

            if (canClick)
            {
                if (current)
                {
                    liTag.AddCssClass("active");
                }
                else
                {
                    liTag.AddCssClass("disabled");
                }
                liTag.InnerHtml += $"<a href='javascript:;'>{text}</a>";
            }
            else
            {
                liTag.InnerHtml += string.Format("<a href='{0}'>{1}</a>", htmlHelper.GeneratePaginationUrl(page, options), text);
            }

            pageBuilder.InnerHtml += liTag.ToString();
        }
        /// <summary>
        /// 输出符合 bootstrap 风格的分页 HTML 一系列相关元素。
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="pagedEntity"><see cref="IPagedCollection{TEntity}"/> 可分页的对象。</param>
        /// <param name="options">分页的配置对象。</param>
        /// <returns></returns>
        public static MvcHtmlString BootstrapPageButton <TEntity>(this HtmlHelper htmlHelper, IPagedCollection <TEntity> pagedEntity, BootstrapPagedButtonOptions options = null)
        {
            if (options == null)
            {
                options = new BootstrapPagedButtonOptions();
            }

            if (pagedEntity.Count == 0 || pagedEntity.ItemsPerPage == 0)
            {
                return(MvcHtmlString.Empty);
            }
            pagedEntity.ComputePages();
            var totalPages = pagedEntity.TotalPages;

            if ((pagedEntity.Count % pagedEntity.ItemsPerPage) > 0)
            {
                totalPages++;
            }

            //未超过一页时不显示分页按钮
            if (!options.AlwaysShow && totalPages <= 1)
            {
                return(MvcHtmlString.Empty);
            }

            var pageIndex = pagedEntity.CurrentPage;

            bool showNumberic = false;
            bool showFirst    = false;
            bool showLast     = false;
            bool showPrevious = false;
            bool showNext     = false;
            var  mode         = options.ButtonMode;

            if (mode == PageButtonMode.FirstLastNumberic || mode == PageButtonMode.PreviousNextFirstLastNumberic || mode == PageButtonMode.PreviousNextNumberic || mode == PageButtonMode.OnlyNumberic)
            {
                showNumberic = true;
            }

            if (mode == PageButtonMode.FirstLastNumberic || mode == PageButtonMode.PreviousNextFirstLast || mode == PageButtonMode.PreviousNextFirstLastNumberic)
            {
                showFirst = true;
                showLast  = true;
            }

            if (mode == PageButtonMode.PreviousNext || mode == PageButtonMode.PreviousNextFirstLast || mode == PageButtonMode.PreviousNextFirstLastNumberic || mode == PageButtonMode.PreviousNextNumberic)
            {
                showPrevious = true;
                showNext     = true;
            }

            string firstText     = options.TextOfFirst;
            string previouseText = options.TextOfPrevious;
            string nextText      = options.TextOfNext;
            string lastText      = options.TextOfLast;

            //分页字符串
            TagBuilder pageBuilder = new TagBuilder("ul");

            pageBuilder.AddCssClass("pagination");

            switch (options.Size)
            {
            case SizeTypes.SM:
                pageBuilder.AddCssClass(" pagination-sm ");
                break;

            case SizeTypes.LG:
                pageBuilder.AddCssClass(" pagination-lg ");
                break;

            default:
                break;
            }

            pageBuilder.MergeAttributes(HtmlHelper.AnonymousObjectToHtmlAttributes(options.HtmlAttributes));

            if (showFirst)
            {
                htmlHelper.GeneratePageButton(pageBuilder, pageIndex <= 1, 1, firstText, options);
            }

            if (showPrevious)
            {
                htmlHelper.GeneratePageButton(pageBuilder, pageIndex - 1 < 1, pageIndex - 1, previouseText, options);
            }

            #region 计算页数

            if (showNumberic)
            {
                long startPage     = 1;
                long endPage       = 1;
                int  numbericCount = options.NumbericCount;
                if (totalPages > numbericCount)
                {
                    if (pageIndex - (numbericCount / 2) > 0)
                    {
                        if (pageIndex + (numbericCount / 2) < totalPages)
                        {
                            startPage = pageIndex - (numbericCount / 2);
                            endPage   = startPage + numbericCount - 1;
                        }
                        else
                        {
                            endPage   = totalPages;
                            startPage = endPage - numbericCount + 1;
                        }
                    }
                    else
                    {
                        endPage = numbericCount;
                    }
                }
                else
                {
                    startPage = 1;
                    endPage   = totalPages;
                }

                for (var i = startPage; i <= endPage; i++)
                {
                    htmlHelper.GeneratePageButton(pageBuilder, i == pagedEntity.CurrentPage, i, i.ToString(), options, i == pagedEntity.CurrentPage);
                }
            }
            #endregion

            if (showNext)
            {
                htmlHelper.GeneratePageButton(pageBuilder, pageIndex + 1 > totalPages, pageIndex + 1, nextText, options);
            }

            if (showLast)
            {
                htmlHelper.GeneratePageButton(pageBuilder, pageIndex >= totalPages, totalPages, lastText, options);
            }
            return(MvcHtmlString.Create(pageBuilder.ToString()));
        }