/// <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())); }