private static TagBuilder PageCountAndLocationText(IPagedList list, PagedListRenderOptions options) { var text = new TagBuilder("a"); SetInnerText(text, string.Format(options.PageCountAndCurrentLocationFormat, list.PageNumber, list.PageCount)); return(WrapInListItem(text, options, "PagedList-pageCountAndLocation", "disabled")); }
private static TagBuilder Ellipses(PagedListRenderOptions options) { var a = new TagBuilder("a"); AppendHtml(a, options.EllipsesFormat); return(WrapInListItem(a, options, "PagedList-ellipses", "disabled")); }
private static TagBuilder ItemSliceAndTotalText(IPagedList list, PagedListRenderOptions options) { var text = new TagBuilder("a"); SetInnerText(text, string.Format(options.ItemSliceAndTotalFormat, list.FirstItemOnPage, list.LastItemOnPage, list.TotalItemCount)); return(WrapInListItem(text, options, "PagedList-pageCountAndLocation", "disabled")); }
private static TagBuilder ItemSliceAndTotalText(IPagedList list, PagedListRenderOptions options) { var text = new TagBuilder("a"); text.AddCssClass("page-link"); _ = text.InnerHtml.AppendHtml(string.Format(options.ItemSliceAndTotalFormat, list.FirstItemOnPage, list.LastItemOnPage, list.TotalItemCount)); return(WrapInListItem(text, options, "PagedList-pageCountAndLocation", "disabled")); }
private static TagBuilder PageCountAndLocationText(IPagedList list, PagedListRenderOptions options) { var text = new TagBuilder("a"); text.AddCssClass("page-link"); _ = text.InnerHtml.AppendHtml(string.Format(options.PageCountAndCurrentLocationFormat, list.PageNumber, list.PageCount)); return(WrapInListItem(text, options, "PagedList-pageCountAndLocation", "disabled")); }
private static TagBuilder Ellipses(PagedListRenderOptions options) { var a = new TagBuilder("a"); { _ = a.InnerHtml.AppendHtml(options.EllipsesFormat); } a.AddCssClass("page-link"); return(WrapInListItem(a, options, "PagedList-ellipses", "disabled")); }
private static TagBuilder WrapInListItem(TagBuilder inner, PagedListRenderOptions options, params string[] classes) { var li = new TagBuilder("li"); foreach (var @class in classes) li.AddCssClass(@class); if (options.FunctionToTransformEachPageLink != null) return options.FunctionToTransformEachPageLink(li, inner); li.InnerHtml = inner.ToString(); return li; }
private static TagBuilder Page(int i, IPagedList list, Func<int, string> generatePageUrl, PagedListRenderOptions options) { var format = options.FunctionToDisplayEachPageNumber ?? (pageNumber => string.Format(options.LinkToIndividualPageFormat, pageNumber)); var targetPageNumber = i; var page = new TagBuilder("a"); page.SetInnerText(format(targetPageNumber)); if (i == list.PageNumber) return WrapInListItem(page, options, "active"); page.Attributes["href"] = generatePageUrl(targetPageNumber); return WrapInListItem(page, options); }
private static TagBuilder First(IPagedList list, Func<int, string> generatePageUrl, PagedListRenderOptions options) { const int targetPageNumber = 1; var first = new TagBuilder("a") { InnerHtml = string.Format(options.LinkToFirstPageFormat, targetPageNumber) }; if (list.IsFirstPage) return WrapInListItem(first, options, "PagedList-skipToFirst", "disabled"); first.Attributes["href"] = generatePageUrl(targetPageNumber); return WrapInListItem(first, options, "PagedList-skipToFirst"); }
private static TagBuilder WrapInListItem(TagBuilder inner, PagedListRenderOptions options, params string[] classes) { var li = new TagBuilder("li"); foreach (var @class in classes) { li.AddCssClass(@class); } if (options.FunctionToTransformEachPageLink != null) { return(options.FunctionToTransformEachPageLink(li, inner)); } AppendHtml(li, TagBuilderToString(inner)); return(li); }
private static TagBuilder Next(IPagedList list, Func<int, string> generatePageUrl, PagedListRenderOptions options) { var targetPageNumber = list.PageNumber + 1; var next = new TagBuilder("a") { InnerHtml = string.Format(options.LinkToNextPageFormat, targetPageNumber) }; next.Attributes["rel"] = "next"; if (!list.HasNextPage) return WrapInListItem(next, options, "PagedList-skipToNext", "disabled"); next.Attributes["href"] = generatePageUrl(targetPageNumber); return WrapInListItem(next, options, "PagedList-skipToNext"); }
private static TagBuilder Previous(IPagedList list, Func<int, string> generatePageUrl, PagedListRenderOptions options) { var targetPageNumber = list.PageNumber - 1; var previous = new TagBuilder("a") { InnerHtml = string.Format(options.LinkToPreviousPageFormat, targetPageNumber) }; previous.Attributes["rel"] = "prev"; if (!list.HasPreviousPage) return WrapInListItem(previous, options, "PagedList-skipToPrevious", "disabled"); previous.Attributes["href"] = generatePageUrl(targetPageNumber); return WrapInListItem(previous, options, "PagedList-skipToPrevious"); }
///<summary> /// Displays a configurable paging control for instances of PagedList. ///</summary> ///<param name="html">This method is meant to hook off HtmlHelper as an extension method.</param> ///<param name="list">The PagedList to use as the data source.</param> ///<param name="generatePageUrl">A function that takes the index of the desired page and returns a URL-string that will load that page.</param> ///<param name="options">Formatting options.</param> ///<returns>Outputs the paging control HTML.</returns> public static MvcHtmlString PagedListPager(this System.Web.Mvc.HtmlHelper html, IPagedList list, Func<int, string> generatePageUrl, PagedListRenderOptions options) { var listItemLinks = new StringBuilder(); //first if (options.DisplayLinkToFirstPage) listItemLinks.Append(First(list, generatePageUrl, options.LinkToFirstPageFormat)); //previous if (options.DisplayLinkToPreviousPage) listItemLinks.Append(Previous(list, generatePageUrl, options.LinkToPreviousPageFormat)); //text if (options.DisplayPageCountAndCurrentLocation) listItemLinks.Append(PageCountAndLocationText(list, options.PageCountAndCurrentLocationFormat)); //text if (options.DisplayItemSliceAndTotal) listItemLinks.Append(ItemSliceAndTotalText(list, options.ItemSliceAndTotalFormat)); //page if (options.DisplayLinkToIndividualPages) foreach (var i in Enumerable.Range(0, list.PageCount)) listItemLinks.Append(Page(i, list, generatePageUrl, options.LinkToIndividualPageFormat)); //next if (options.DisplayLinkToNextPage) listItemLinks.Append(Next(list, generatePageUrl, options.LinkToNextPageFormat)); //last if (options.DisplayLinkToLastPage) listItemLinks.Append(Last(list, generatePageUrl, options.LinkToLastPageFormat)); var ul = new TagBuilder("ul") { InnerHtml = listItemLinks.ToString() }; var outerDiv = new TagBuilder("div"); outerDiv.AddCssClass("PagedList-pager"); outerDiv.InnerHtml = ul.ToString(); return new MvcHtmlString(outerDiv.ToString()); }
/// <summary> /// Enables ASP.NET MVC's unobtrusive AJAX feature. An XHR request will retrieve HTML from the clicked page and replace the innerHtml of the provided element ID. /// </summary> /// <param name="options">The preferred Html.PagedList(...) style options.</param> /// <param name="ajaxOptions">The ajax options that will put into the link</param> /// <returns>The PagedListRenderOptions value passed in, with unobtrusive AJAX attributes added to the page links.</returns> public static PagedListRenderOptions EnableUnobtrusiveAjaxReplacing(PagedListRenderOptions options, AjaxOptions ajaxOptions) { options.FunctionToTransformEachPageLink = (liTagBuilder, aTagBuilder) => { var liClass = liTagBuilder.Attributes.ContainsKey("class") ? liTagBuilder.Attributes["class"] ?? "" : ""; if (ajaxOptions != null && !liClass.Contains("disabled") && !liClass.Contains("active")) { foreach (var ajaxOption in ajaxOptions.ToUnobtrusiveHtmlAttributes()) { aTagBuilder.Attributes.Add(ajaxOption.Key, ajaxOption.Value.ToString()); } } liTagBuilder.InnerHtml = aTagBuilder.ToString(); return(liTagBuilder); }; return(options); }
private static TagBuilder WrapInListItem(TagBuilder inner, PagedListRenderOptions options, params string[] classes) { var li = new TagBuilder("li"); foreach (var @class in classes) { li.AddCssClass(@class); } if (options.FunctionToTransformEachPageLink != null) { return(options.FunctionToTransformEachPageLink(li, inner)); } //新增:将AElementClasses中的样式添加到翻页链接中 foreach (var c in options.AElementClasses ?? Enumerable.Empty <string>()) { inner.AddCssClass(c); } li.InnerHtml = inner.ToString(); return(li); }
/// <summary> /// Enables ASP.NET MVC's unobtrusive AJAX feature. An XHR request will retrieve HTML from the clicked page and replace the innerHtml of the provided element ID. /// </summary> /// <param name="options">The preferred Html.PagedList(...) style options.</param> /// <param name="id">The element ID ("#my_id") of the element whose innerHtml should be replaced.</param> /// <returns>The PagedListRenderOptions value passed in, with unobtrusive AJAX attributes added to the page links.</returns> public static PagedListRenderOptions EnableUnobtrusiveAjaxReplacing(PagedListRenderOptions options, string id) { options.FunctionToTransformEachPageLink = (liTagBuilder, aTagBuilder) => { var appendUnobtrusiveAjaxAttributes = true; if (liTagBuilder.Attributes.ContainsKey("class")) { var liClasses = liTagBuilder.Attributes["class"].Split(' '); appendUnobtrusiveAjaxAttributes = !liClasses.Contains("disabled") && !liClasses.Contains("active"); } if (appendUnobtrusiveAjaxAttributes) { aTagBuilder.Attributes.Add("data-ajax", "true"); aTagBuilder.Attributes.Add("data-ajax-method", "get"); aTagBuilder.Attributes.Add("data-ajax-mode", "replace"); aTagBuilder.Attributes.Add("data-ajax-update", id); } liTagBuilder.InnerHtml = aTagBuilder.ToString(); return(liTagBuilder); }; return(options); }
private static TagBuilder Next(IPagedList list, Func <int, string> generatePageUrl, PagedListRenderOptions options) { var targetPageNumber = list.PageNumber + 1; var next = new TagBuilder("a"); AppendHtml(next, string.Format(options.LinkToNextPageFormat, targetPageNumber)); next.Attributes["rel"] = "next"; foreach (var c in options.PageClasses ?? Enumerable.Empty <string>()) { next.AddCssClass(c); } if (!list.HasNextPage) { return(WrapInListItem(next, options, "PagedList-skipToNext", "disabled")); } next.Attributes["href"] = generatePageUrl(targetPageNumber); return(WrapInListItem(next, options, "PagedList-skipToNext")); }
private static TagBuilder Previous(IPagedList list, Func <int, string> generatePageUrl, PagedListRenderOptions options) { var targetPageNumber = list.PageNumber - 1; var previous = new TagBuilder("a"); AppendHtml(previous, string.Format(options.LinkToPreviousPageFormat, targetPageNumber)); previous.Attributes["rel"] = "prev"; foreach (var c in options.PageClasses ?? Enumerable.Empty <string>()) { previous.AddCssClass(c); } if (!list.HasPreviousPage) { return(WrapInListItem(previous, options, "PagedList-skipToPrevious", "disabled")); } previous.Attributes["href"] = generatePageUrl(targetPageNumber); return(WrapInListItem(previous, options, "PagedList-skipToPrevious")); }
private static TagBuilder Page(int i, IPagedList list, Func <int, string> generatePageUrl, PagedListRenderOptions options) { var format = options.FunctionToDisplayEachPageNumber ?? (pageNumber => string.Format(options.LinkToIndividualPageFormat, pageNumber)); var targetPageNumber = i; var page = i == list.PageNumber ? new TagBuilder("span") : new TagBuilder("a"); SetInnerText(page, format(targetPageNumber)); foreach (var c in options.PageClasses ?? Enumerable.Empty <string>()) { page.AddCssClass(c); } if (i == list.PageNumber) { return(WrapInListItem(page, options, "active")); } page.Attributes["href"] = generatePageUrl(targetPageNumber); return(WrapInListItem(page, options)); }
private static TagBuilder Page(int i, IPagedList list, Func <int, string> generatePageUrl, PagedListRenderOptions options) { var format = options.FunctionToDisplayEachPageNumber ?? (pageNumber => string.Format(options.LinkToIndividualPageFormat, pageNumber)); var targetPageNumber = i; var page = new TagBuilder("a"); page.SetInnerText(format(targetPageNumber)); if (i == list.PageNumber) { return(WrapInListItem(page, options, "active")); } page.Attributes["href"] = generatePageUrl(targetPageNumber); return(WrapInListItem(page, options)); }
private static TagBuilder Next(IPagedList list, Func <int, string> generatePageUrl, PagedListRenderOptions options) { var targetPageNumber = list.PageNumber + 1; var next = new TagBuilder("a") { InnerHtml = string.Format(options.LinkToNextPageFormat, targetPageNumber) }; if (!list.HasNextPage) { return(WrapInListItem(next, options, "PagedList-skipToNext", "disabled")); } next.Attributes["href"] = generatePageUrl(targetPageNumber); return(WrapInListItem(next, options, "PagedList-skipToNext")); }
///<summary> /// Displays a configurable paging control for instances of PagedList. ///</summary> ///<param name="html">This method is meant to hook off HtmlHelper as an extension method.</param> ///<param name="list">The PagedList to use as the data source.</param> ///<param name="generatePageUrl">A function that takes the index of the desired page and returns a URL-string that will load that page.</param> ///<param name="options">Formatting options.</param> ///<returns>Outputs the paging control HTML.</returns> public static MvcHtmlString PagedListPager(this System.Web.Mvc.HtmlHelper html, IPagedList list, Func <int, string> generatePageUrl, PagedListRenderOptions options) { var listItemLinks = new StringBuilder(); //first if (options.DisplayLinkToFirstPage) { listItemLinks.Append(First(list, generatePageUrl, options.LinkToFirstPageFormat)); } //previous if (options.DisplayLinkToPreviousPage) { listItemLinks.Append(Previous(list, generatePageUrl, options.LinkToPreviousPageFormat)); } //text if (options.DisplayPageCountAndCurrentLocation) { listItemLinks.Append(PageCountAndLocationText(list, options.PageCountAndCurrentLocationFormat)); } //text if (options.DisplayItemSliceAndTotal) { listItemLinks.Append(ItemSliceAndTotalText(list, options.ItemSliceAndTotalFormat)); } //page if (options.DisplayLinkToIndividualPages) { foreach (var i in Enumerable.Range(0, list.PageCount)) { listItemLinks.Append(Page(i, list, generatePageUrl, options.LinkToIndividualPageFormat)); } } //next if (options.DisplayLinkToNextPage) { listItemLinks.Append(Next(list, generatePageUrl, options.LinkToNextPageFormat)); } //last if (options.DisplayLinkToLastPage) { listItemLinks.Append(Last(list, generatePageUrl, options.LinkToLastPageFormat)); } var ul = new TagBuilder("ul") { InnerHtml = listItemLinks.ToString() }; var outerDiv = new TagBuilder("div"); outerDiv.AddCssClass("PagedList-pager"); outerDiv.InnerHtml = ul.ToString(); return(new MvcHtmlString(outerDiv.ToString())); }
private static TagBuilder Previous(IPagedList list, Func <int, string> generatePageUrl, PagedListRenderOptions options) { var targetPageNumber = list.PageNumber - 1; var previous = new TagBuilder("a") { InnerHtml = string.Format(options.LinkToPreviousPageFormat, targetPageNumber) }; if (!list.HasPreviousPage) { return(WrapInListItem(previous, options, "PagedList-skipToPrevious", "disabled")); } previous.Attributes["href"] = generatePageUrl(targetPageNumber); return(WrapInListItem(previous, options, "PagedList-skipToPrevious")); }
/// <summary> /// Enables ASP.NET MVC's unobtrusive AJAX feature. An XHR request will retrieve HTML from the clicked page and replace the innerHtml of the provided element ID. /// </summary> /// <param name="options">The preferred Html.PagedList(...) style options.</param> /// <param name="ajaxOptions">The ajax options that will put into the link</param> /// <returns>The PagedListRenderOptions value passed in, with unobtrusive AJAX attributes added to the page links.</returns> public static PagedListRenderOptions EnableUnobtrusiveAjaxReplacing(PagedListRenderOptions options, AjaxOptions ajaxOptions) { options.FunctionToTransformEachPageLink = (liTagBuilder, aTagBuilder) => { var liClass = liTagBuilder.Attributes.ContainsKey("class") ? liTagBuilder.Attributes["class"] ?? "" : ""; if (ajaxOptions != null && !liClass.Contains("disabled") && !liClass.Contains("active")) { foreach (var ajaxOption in ajaxOptions.ToUnobtrusiveHtmlAttributes()) aTagBuilder.Attributes.Add(ajaxOption.Key, ajaxOption.Value.ToString()); } liTagBuilder.InnerHtml = aTagBuilder.ToString(); return liTagBuilder; }; return options; }
///<summary> /// Displays a configurable paging control for instances of PagedList. ///</summary> ///<param name = "html">This method is meant to hook off HtmlHelper as an extension method.</param> ///<param name = "list">The PagedList to use as the data source.</param> ///<param name = "generatePageUrl">A function that takes the page number of the desired page and returns a URL-string that will load that page.</param> ///<param name = "options">Formatting options.</param> ///<returns>Outputs the paging control HTML.</returns> public static MvcHtmlString PagedListPager(this System.Web.Mvc.HtmlHelper html, IPagedList list, Func<int, string> generatePageUrl, PagedListRenderOptions options) { var listItemLinks = new List<TagBuilder>(); //first if (options.DisplayLinkToFirstPage) listItemLinks.Add(First(list, generatePageUrl, options.LinkToFirstPageFormat)); //previous if (options.DisplayLinkToPreviousPage) listItemLinks.Add(Previous(list, generatePageUrl, options.LinkToPreviousPageFormat)); //text if (options.DisplayPageCountAndCurrentLocation) listItemLinks.Add(PageCountAndLocationText(list, options.PageCountAndCurrentLocationFormat)); //text if (options.DisplayItemSliceAndTotal) listItemLinks.Add(ItemSliceAndTotalText(list, options.ItemSliceAndTotalFormat)); //page if (options.DisplayLinkToIndividualPages) { //calculate start and end of range of page numbers var start = 1; var end = list.PageCount; if (options.MaximumPageNumbersToDisplay.HasValue && list.PageCount > options.MaximumPageNumbersToDisplay) { var maxPageNumbersToDisplay = options.MaximumPageNumbersToDisplay.Value; start = list.PageNumber - maxPageNumbersToDisplay / 2; if (start < 1) start = 1; end = maxPageNumbersToDisplay; if ((start + end - 1) > list.PageCount) start = list.PageCount - maxPageNumbersToDisplay + 1; } //if there are previous page numbers not displayed, show an ellipsis if (options.DisplayEllipsesWhenNotShowingAllPageNumbers && start > 1) listItemLinks.Add(Ellipses(options.EllipsesFormat)); foreach (var i in Enumerable.Range(start, end)) { //show delimiter between page numbers if (i > start && !string.IsNullOrWhiteSpace(options.DelimiterBetweenPageNumbers)) listItemLinks.Add(WrapInListItem(options.DelimiterBetweenPageNumbers)); //show page number link listItemLinks.Add(options.FunctionToDisplayEachPageNumber == null ? Page(i, list, generatePageUrl, options.LinkToIndividualPageFormat) : Page(i, list, generatePageUrl, options.FunctionToDisplayEachPageNumber)); } //if there are subsequent page numbers not displayed, show an ellipsis if (options.DisplayEllipsesWhenNotShowingAllPageNumbers && (start + end - 1) < list.PageCount) listItemLinks.Add(Ellipses(options.EllipsesFormat)); } //next if (options.DisplayLinkToNextPage) listItemLinks.Add(Next(list, generatePageUrl, options.LinkToNextPageFormat)); //last if (options.DisplayLinkToLastPage) listItemLinks.Add(Last(list, generatePageUrl, options.LinkToLastPageFormat)); //append class to last item in list? if (!string.IsNullOrWhiteSpace(options.ClassToApplyToLastListItemInPager)) listItemLinks.Last().AddCssClass(options.ClassToApplyToLastListItemInPager); //collapse all of the list items into one big string var listItemLinksString = listItemLinks.Aggregate( new StringBuilder(), (sb, listItem) => sb.Append(listItem.ToString()), sb=> sb.ToString() ); var ul = new TagBuilder("ul") { InnerHtml = listItemLinksString }; var outerDiv = new TagBuilder("div"); outerDiv.AddCssClass("PagedList-pager"); outerDiv.AddCssClass("pagination"); outerDiv.InnerHtml = ul.ToString(); return new MvcHtmlString(outerDiv.ToString()); }
private static TagBuilder PageCountAndLocationText(IPagedList list, PagedListRenderOptions options) { var text = new TagBuilder("a"); text.SetInnerText(string.Format(options.PageCountAndCurrentLocationFormat, list.PageNumber, list.PageCount)); return WrapInListItem(text, options, "PagedList-pageCountAndLocation", "disabled"); }
///<summary> /// Displays a configurable paging control for instances of PagedList. ///</summary> ///<param name = "html">This method is meant to hook off HtmlHelper as an extension method.</param> ///<param name = "list">The PagedList to use as the data source.</param> ///<param name = "generatePageUrl">A function that takes the page number of the desired page and returns a URL-string that will load that page.</param> ///<param name = "options">Formatting options.</param> ///<returns>Outputs the paging control HTML.</returns> public static MvcHtmlString PagedListPager(this System.Web.Mvc.HtmlHelper html, IPagedList list, Func <int, string> generatePageUrl, PagedListRenderOptions options) { var listItemLinks = new StringBuilder(); //first if (options.DisplayLinkToFirstPage) { listItemLinks.Append(First(list, generatePageUrl, options.LinkToFirstPageFormat)); } //previous if (options.DisplayLinkToPreviousPage) { listItemLinks.Append(Previous(list, generatePageUrl, options.LinkToPreviousPageFormat)); } //text if (options.DisplayPageCountAndCurrentLocation) { listItemLinks.Append(PageCountAndLocationText(list, options.PageCountAndCurrentLocationFormat)); } //text if (options.DisplayItemSliceAndTotal) { listItemLinks.Append(ItemSliceAndTotalText(list, options.ItemSliceAndTotalFormat)); } //page if (options.DisplayLinkToIndividualPages) { //calculate start and end of range of page numbers var start = 1; var end = list.PageCount; if (options.MaximumPageNumbersToDisplay.HasValue && list.PageCount > options.MaximumPageNumbersToDisplay) { var maxPageNumbersToDisplay = options.MaximumPageNumbersToDisplay.Value; start = list.PageNumber - maxPageNumbersToDisplay / 2; if (start < 1) { start = 1; } end = maxPageNumbersToDisplay; if ((start + end - 1) > list.PageCount) { start = list.PageCount - maxPageNumbersToDisplay + 1; } } //if there are previous page numbers not displayed, show an ellipsis if (options.DisplayEllipsesWhenNotShowingAllPageNumbers && start > 1) { listItemLinks.Append(Ellipses(options.EllipsesFormat)); } foreach (var i in Enumerable.Range(start, end)) { //show delimiter between page numbers if (i > start && !string.IsNullOrWhiteSpace(options.DelimiterBetweenPageNumbers)) { listItemLinks.Append(options.DelimiterBetweenPageNumbers); } //show page number link listItemLinks.Append(options.FunctionToDisplayEachPageNumber == null ? Page(i, list, generatePageUrl, options.LinkToIndividualPageFormat) : Page(i, list, generatePageUrl, options.FunctionToDisplayEachPageNumber)); } //if there are subsequent page numbers not displayed, show an ellipsis if (options.DisplayEllipsesWhenNotShowingAllPageNumbers && (start + end - 1) < list.PageCount) { listItemLinks.Append(Ellipses(options.EllipsesFormat)); } } //next if (options.DisplayLinkToNextPage) { listItemLinks.Append(Next(list, generatePageUrl, options.LinkToNextPageFormat)); } //last if (options.DisplayLinkToLastPage) { listItemLinks.Append(Last(list, generatePageUrl, options.LinkToLastPageFormat)); } var ul = new TagBuilder("ul") { InnerHtml = listItemLinks.ToString() }; var outerDiv = new TagBuilder("div"); outerDiv.AddCssClass("PagedList-pager"); outerDiv.InnerHtml = ul.ToString(); return(new MvcHtmlString(outerDiv.ToString())); }
private static TagBuilder Last(IPagedList list, Func<int, string> generatePageUrl, Func<int, string> generateAjaxUrl, PagedListRenderOptions options) { var targetPageNumber = list.PageCount; var last = new TagBuilder("a") { InnerHtml = string.Format(options.LinkToLastPageFormat, targetPageNumber) }; if (list.IsLastPage) return WrapInListItem(last, options, "PagedList-skipToLast", "disabled"); last.Attributes["href"] = generatePageUrl(targetPageNumber); if (generateAjaxUrl != null) { last.Attributes[options.UnobtrusiveAjaxAttrName] = generateAjaxUrl(targetPageNumber); } return WrapInListItem(last, options, "PagedList-skipToLast"); }
private static TagBuilder Last(IPagedList list, Func <int, string> generatePageUrl, PagedListRenderOptions options) { var targetPageNumber = list.PageCount; var last = new TagBuilder("a"); { _ = last.InnerHtml.AppendHtml(string.Format(options.LinkToLastPageFormat, targetPageNumber)); } last.AddCssClass("page-link"); if (list.IsLastPage) { return(WrapInListItem(last, options, "PagedList-skipToLast", "disabled")); } last.Attributes["href"] = generatePageUrl(targetPageNumber); return(WrapInListItem(last, options, "PagedList-skipToLast")); }
/// <summary> /// Enables ASP.NET MVC's unobtrusive AJAX feature. An XHR request will retrieve HTML from the clicked page and replace the innerHtml of the provided element ID. /// </summary> /// <param name="options">The preferred Html.PagedList(...) style options.</param> /// <param name="id">The element ID ("#my_id") of the element whose innerHtml should be replaced.</param> /// <returns>The PagedListRenderOptions value passed in, with unobtrusive AJAX attributes added to the page links.</returns> public static PagedListRenderOptions EnableUnobtrusiveAjaxReplacing(PagedListRenderOptions options, string id) { options.FunctionToTransformEachPageLink = (liTagBuilder, aTagBuilder) => { var appendUnobtrusiveAjaxAttributes = true; if (liTagBuilder.Attributes.ContainsKey("class")) { var liClasses = liTagBuilder.Attributes["class"].Split(' '); appendUnobtrusiveAjaxAttributes = !liClasses.Contains("disabled") && !liClasses.Contains("active"); } if (appendUnobtrusiveAjaxAttributes) { aTagBuilder.Attributes.Add("data-ajax", "true"); aTagBuilder.Attributes.Add("data-ajax-method", "get"); aTagBuilder.Attributes.Add("data-ajax-mode", "replace"); aTagBuilder.Attributes.Add("data-ajax-update", id); } liTagBuilder.InnerHtml = aTagBuilder.ToString(); return liTagBuilder; }; return options; }
///<summary> /// Displays a configurable paging control for instances of PagedList. ///</summary> ///<param name = "html">This method is meant to hook off HtmlHelper as an extension method.</param> ///<param name = "list">The PagedList to use as the data source.</param> ///<param name = "generatePageUrl">A function that takes the page number of the desired page and returns a URL-string that will load that page.</param> ///<param name = "options">Formatting options.</param> ///<returns>Outputs the paging control HTML.</returns> public static MvcHtmlString PagedListPager(this System.Web.Mvc.HtmlHelper html, IPagedList list, Func <int, string> generatePageUrl, PagedListRenderOptions options) { var listItemLinks = new List <TagBuilder>(); //first if (options.DisplayLinkToFirstPage) { listItemLinks.Add(First(list, generatePageUrl, options)); } //previous if (options.DisplayLinkToPreviousPage) { listItemLinks.Add(Previous(list, generatePageUrl, options)); } //text if (options.DisplayPageCountAndCurrentLocation) { listItemLinks.Add(PageCountAndLocationText(list, options)); } //text if (options.DisplayItemSliceAndTotal) { listItemLinks.Add(ItemSliceAndTotalText(list, options)); } //page if (options.DisplayLinkToIndividualPages) { //calculate start and end of range of page numbers var start = 1; var end = list.PageCount; if (options.MaximumPageNumbersToDisplay.HasValue && list.PageCount > options.MaximumPageNumbersToDisplay) { var maxPageNumbersToDisplay = options.MaximumPageNumbersToDisplay.Value; start = list.PageNumber - maxPageNumbersToDisplay / 2; if (start < 1) { start = 1; } end = maxPageNumbersToDisplay; if ((start + end - 1) > list.PageCount) { start = list.PageCount - maxPageNumbersToDisplay + 1; } } //if there are previous page numbers not displayed, show an ellipsis if (options.DisplayEllipsesWhenNotShowingAllPageNumbers && start > 1) { listItemLinks.Add(Ellipses(options)); } foreach (var i in Enumerable.Range(start, end)) { //show delimiter between page numbers if (i > start && !string.IsNullOrWhiteSpace(options.DelimiterBetweenPageNumbers)) { listItemLinks.Add(WrapInListItem(options.DelimiterBetweenPageNumbers)); } //show page number link listItemLinks.Add(Page(i, list, generatePageUrl, options)); } //if there are subsequent page numbers not displayed, show an ellipsis if (options.DisplayEllipsesWhenNotShowingAllPageNumbers && (start + end - 1) < list.PageCount) { listItemLinks.Add(Ellipses(options)); } } //next if (options.DisplayLinkToNextPage) { listItemLinks.Add(Next(list, generatePageUrl, options)); } //last if (options.DisplayLinkToLastPage) { listItemLinks.Add(Last(list, generatePageUrl, options)); } //append class to first item in list? if (!string.IsNullOrWhiteSpace(options.ClassToApplyToFirstListItemInPager)) { listItemLinks.First().AddCssClass(options.ClassToApplyToFirstListItemInPager); } //append class to last item in list? if (!string.IsNullOrWhiteSpace(options.ClassToApplyToLastListItemInPager)) { listItemLinks.Last().AddCssClass(options.ClassToApplyToLastListItemInPager); } //append classes to all list item links foreach (var li in listItemLinks) { foreach (var c in options.LiElementClasses ?? Enumerable.Empty <string>()) { li.AddCssClass(c); } } //collapse all of the list items into one big string var listItemLinksString = listItemLinks.Aggregate( new StringBuilder(), (sb, listItem) => sb.Append(listItem.ToString()), sb => sb.ToString() ); var ul = new TagBuilder("ul") { InnerHtml = listItemLinksString }; foreach (var c in options.UlElementClasses ?? Enumerable.Empty <string>()) { ul.AddCssClass(c); } var outerDiv = new TagBuilder("div"); foreach (var c in options.ContainerDivClasses ?? Enumerable.Empty <string>()) { outerDiv.AddCssClass(c); } outerDiv.InnerHtml = ul.ToString(); return(new MvcHtmlString(outerDiv.ToString())); }
private static TagBuilder First(IPagedList list, Func <int, string> generatePageUrl, PagedListRenderOptions options) { const int targetPageNumber = 1; var first = new TagBuilder("a") { InnerHtml = string.Format(options.LinkToFirstPageFormat, targetPageNumber) }; if (list.IsFirstPage) { return(WrapInListItem(first, options, "PagedList-skipToFirst", "disabled")); } first.Attributes["href"] = generatePageUrl(targetPageNumber); return(WrapInListItem(first, options, "PagedList-skipToFirst")); }
///<summary> /// Displays a configurable paging control for instances of PagedList. ///</summary> ///<param name = "html">This method is meant to hook off HtmlHelper as an extension method.</param> ///<param name = "list">The PagedList to use as the data source.</param> ///<param name = "generatePageUrl">A function that takes the page number of the desired page and returns a URL-string that will load that page.</param> ///<param name = "generateAjaxUrl">A function that takes the page number of the desired page and returns a URL-string that using for unobtrusive ajax.</param> ///<param name = "options">Formatting options.</param> ///<returns>Outputs the paging control HTML.</returns> public static MvcHtmlString PagedListPager(this System.Web.Mvc.HtmlHelper html, IPagedList list, Func<int, string> generatePageUrl, Func<int, string> generateAjaxUrl, PagedListRenderOptions options) { if (options.Display == PagedListDisplayMode.Never || (options.Display == PagedListDisplayMode.IfNeeded && list.PageCount <= 1)) return null; var listItemLinks = new List<TagBuilder>(); //calculate start and end of range of page numbers var firstPageToDisplay = 1; var lastPageToDisplay = list.PageCount; var pageNumbersToDisplay = lastPageToDisplay; if (options.MaximumPageNumbersToDisplay.HasValue && list.PageCount > options.MaximumPageNumbersToDisplay) { // cannot fit all pages into pager var maxPageNumbersToDisplay = options.MaximumPageNumbersToDisplay.Value; firstPageToDisplay = list.PageNumber - maxPageNumbersToDisplay / 2; if (firstPageToDisplay < 1) firstPageToDisplay = 1; pageNumbersToDisplay = maxPageNumbersToDisplay; lastPageToDisplay = firstPageToDisplay + pageNumbersToDisplay - 1; if (lastPageToDisplay > list.PageCount) firstPageToDisplay = list.PageCount - maxPageNumbersToDisplay + 1; } //first if (options.DisplayLinkToFirstPage == PagedListDisplayMode.Always || (options.DisplayLinkToFirstPage == PagedListDisplayMode.IfNeeded && firstPageToDisplay > 1)) listItemLinks.Add(First(list, generatePageUrl, generateAjaxUrl, options)); //previous if (options.DisplayLinkToPreviousPage == PagedListDisplayMode.Always || (options.DisplayLinkToPreviousPage == PagedListDisplayMode.IfNeeded && !list.IsFirstPage)) listItemLinks.Add(Previous(list, generatePageUrl, generateAjaxUrl, options)); //text if (options.DisplayPageCountAndCurrentLocation) listItemLinks.Add(PageCountAndLocationText(list, options)); //text if (options.DisplayItemSliceAndTotal) listItemLinks.Add(ItemSliceAndTotalText(list, options)); //page if (options.DisplayLinkToIndividualPages) { //if there are previous page numbers not displayed, show an ellipsis if (options.DisplayEllipsesWhenNotShowingAllPageNumbers && firstPageToDisplay > 1) listItemLinks.Add(Ellipses(options)); foreach (var i in Enumerable.Range(firstPageToDisplay, pageNumbersToDisplay)) { //show delimiter between page numbers if (i > firstPageToDisplay && !string.IsNullOrWhiteSpace(options.DelimiterBetweenPageNumbers)) listItemLinks.Add(WrapInListItem(options.DelimiterBetweenPageNumbers)); //show page number link listItemLinks.Add(Page(i, list, generatePageUrl, generateAjaxUrl, options)); } //if there are subsequent page numbers not displayed, show an ellipsis if (options.DisplayEllipsesWhenNotShowingAllPageNumbers && (firstPageToDisplay + pageNumbersToDisplay - 1) < list.PageCount) listItemLinks.Add(Ellipses(options)); } //next if (options.DisplayLinkToNextPage == PagedListDisplayMode.Always || (options.DisplayLinkToNextPage == PagedListDisplayMode.IfNeeded && !list.IsLastPage)) listItemLinks.Add(Next(list, generatePageUrl, generateAjaxUrl, options)); //last if (options.DisplayLinkToLastPage == PagedListDisplayMode.Always || (options.DisplayLinkToLastPage == PagedListDisplayMode.IfNeeded && lastPageToDisplay < list.PageCount)) listItemLinks.Add(Last(list, generatePageUrl, generateAjaxUrl, options)); if(listItemLinks.Any()) { //append class to first item in list? if (!string.IsNullOrWhiteSpace(options.ClassToApplyToFirstListItemInPager)) listItemLinks.First().AddCssClass(options.ClassToApplyToFirstListItemInPager); //append class to last item in list? if (!string.IsNullOrWhiteSpace(options.ClassToApplyToLastListItemInPager)) listItemLinks.Last().AddCssClass(options.ClassToApplyToLastListItemInPager); //append classes to all list item links foreach (var li in listItemLinks) foreach (var c in options.LiElementClasses ?? Enumerable.Empty<string>()) li.AddCssClass(c); } //collapse all of the list items into one big string var listItemLinksString = listItemLinks.Aggregate( new StringBuilder(), (sb, listItem) => sb.Append(listItem.ToString()), sb=> sb.ToString() ); var ul = new TagBuilder("ul") { InnerHtml = listItemLinksString }; foreach (var c in options.UlElementClasses ?? Enumerable.Empty<string>()) ul.AddCssClass(c); var outerDiv = new TagBuilder("div"); foreach(var c in options.ContainerDivClasses ?? Enumerable.Empty<string>()) outerDiv.AddCssClass(c); outerDiv.InnerHtml = ul.ToString(); return new MvcHtmlString(outerDiv.ToString()); }
///<summary> /// Displays a configurable paging control for instances of PagedList. ///</summary> ///<param name = "html">This method is meant to hook off HtmlHelper as an extension method.</param> ///<param name = "list">The PagedList to use as the data source.</param> ///<param name = "generatePageUrl">A function that takes the page number of the desired page and returns a URL-string that will load that page.</param> ///<param name = "options">Formatting options.</param> ///<returns>Outputs the paging control HTML.</returns> public static MvcHtmlString PagedListPager(this System.Web.Mvc.HtmlHelper html, IPagedList list, Func<int, string> generatePageUrl, PagedListRenderOptions options) { return PagedListPager(html, list, generatePageUrl, null, options); }
///<summary> /// Displays a configurable paging control for instances of PagedList. ///</summary> ///<param name = "html">This method is meant to hook off HtmlHelper as an extension method.</param> ///<param name = "list">The PagedList to use as the data source.</param> ///<param name = "generatePageUrl">A function that takes the page number of the desired page and returns a URL-string that will load that page.</param> ///<param name = "options">Formatting options.</param> ///<returns>Outputs the paging control HTML.</returns> public static HtmlString PagedListPager(this IHtmlHelper html, IPagedList list, Func <int, string> generatePageUrl, PagedListRenderOptions options) { if (options.Display == PagedListDisplayMode.Never || (options.Display == PagedListDisplayMode.IfNeeded && list.PageCount <= 1)) { return(null); } var listItemLinks = new List <TagBuilder>(); //calculate start and end of range of page numbers var firstPageToDisplay = 1; var lastPageToDisplay = list.PageCount; var pageNumbersToDisplay = lastPageToDisplay; if (options.MaximumPageNumbersToDisplay.HasValue && list.PageCount > options.MaximumPageNumbersToDisplay) { // cannot fit all pages into pager var maxPageNumbersToDisplay = options.MaximumPageNumbersToDisplay.Value; firstPageToDisplay = list.PageNumber - maxPageNumbersToDisplay / 2; if (firstPageToDisplay < 1) { firstPageToDisplay = 1; } pageNumbersToDisplay = maxPageNumbersToDisplay; lastPageToDisplay = firstPageToDisplay + pageNumbersToDisplay - 1; if (lastPageToDisplay > list.PageCount) { firstPageToDisplay = list.PageCount - maxPageNumbersToDisplay + 1; } } //first if (options.DisplayLinkToFirstPage == PagedListDisplayMode.Always || (options.DisplayLinkToFirstPage == PagedListDisplayMode.IfNeeded && firstPageToDisplay > 1)) { listItemLinks.Add(First(list, generatePageUrl, options)); } //previous if (options.DisplayLinkToPreviousPage == PagedListDisplayMode.Always || (options.DisplayLinkToPreviousPage == PagedListDisplayMode.IfNeeded && !list.IsFirstPage)) { listItemLinks.Add(Previous(list, generatePageUrl, options)); } //text if (options.DisplayPageCountAndCurrentLocation) { listItemLinks.Add(PageCountAndLocationText(list, options)); } //text if (options.DisplayItemSliceAndTotal) { listItemLinks.Add(ItemSliceAndTotalText(list, options)); } //page if (options.DisplayLinkToIndividualPages) { //if there are previous page numbers not displayed, show an ellipsis if (options.DisplayEllipsesWhenNotShowingAllPageNumbers && firstPageToDisplay > 1) { listItemLinks.Add(Ellipses(options)); } foreach (var i in Enumerable.Range(firstPageToDisplay, pageNumbersToDisplay)) { //show delimiter between page numbers if (i > firstPageToDisplay && !string.IsNullOrWhiteSpace(options.DelimiterBetweenPageNumbers)) { listItemLinks.Add(WrapInListItem(options.DelimiterBetweenPageNumbers)); } //show page number link listItemLinks.Add(Page(i, list, generatePageUrl, options)); } //if there are subsequent page numbers not displayed, show an ellipsis if (options.DisplayEllipsesWhenNotShowingAllPageNumbers && (firstPageToDisplay + pageNumbersToDisplay - 1) < list.PageCount) { listItemLinks.Add(Ellipses(options)); } } //next if (options.DisplayLinkToNextPage == PagedListDisplayMode.Always || (options.DisplayLinkToNextPage == PagedListDisplayMode.IfNeeded && !list.IsLastPage)) { listItemLinks.Add(Next(list, generatePageUrl, options)); } //last if (options.DisplayLinkToLastPage == PagedListDisplayMode.Always || (options.DisplayLinkToLastPage == PagedListDisplayMode.IfNeeded && lastPageToDisplay < list.PageCount)) { listItemLinks.Add(Last(list, generatePageUrl, options)); } if (listItemLinks.Any()) { //append class to first item in list? if (!string.IsNullOrWhiteSpace(options.ClassToApplyToFirstListItemInPager)) { listItemLinks.First().AddCssClass(options.ClassToApplyToFirstListItemInPager); } //append class to last item in list? if (!string.IsNullOrWhiteSpace(options.ClassToApplyToLastListItemInPager)) { listItemLinks.Last().AddCssClass(options.ClassToApplyToLastListItemInPager); } //append classes to all list item links foreach (var li in listItemLinks) { foreach (var c in options.LiElementClasses ?? Enumerable.Empty <string>()) { li.AddCssClass(c); } } } //collapse all of the list items into one big string var listItemLinksString = listItemLinks.Aggregate( new StringBuilder(), (sb, listItem) => sb.Append(TagBuilderToString(listItem)), sb => sb.ToString() ); var ul = new TagBuilder("ul"); AppendHtml(ul, listItemLinksString); foreach (var c in options.UlElementClasses ?? Enumerable.Empty <string>()) { ul.AddCssClass(c); } var outerDiv = new TagBuilder("div"); foreach (var c in options.ContainerDivClasses ?? Enumerable.Empty <string>()) { outerDiv.AddCssClass(c); } AppendHtml(outerDiv, TagBuilderToString(ul)); return(new HtmlString(TagBuilderToString(outerDiv))); }
private static TagBuilder Ellipses(PagedListRenderOptions options) { var a = new TagBuilder("a") { InnerHtml = options.EllipsesFormat }; return WrapInListItem(a, options, "PagedList-ellipses", "disabled"); }
private static TagBuilder First(IPagedList list, Func <int, string> generatePageUrl, PagedListRenderOptions options) { const int targetPageNumber = 1; var first = new TagBuilder("a"); AppendHtml(first, string.Format(options.LinkToFirstPageFormat, targetPageNumber)); foreach (var c in options.PageClasses ?? Enumerable.Empty <string>()) { first.AddCssClass(c); } if (list.IsFirstPage) { return(WrapInListItem(first, options, "PagedList-skipToFirst", "disabled")); } first.Attributes["href"] = generatePageUrl(targetPageNumber); return(WrapInListItem(first, options, "PagedList-skipToFirst")); }
private static TagBuilder ItemSliceAndTotalText(IPagedList list, PagedListRenderOptions options) { var text = new TagBuilder("a"); text.SetInnerText(string.Format(options.ItemSliceAndTotalFormat, list.FirstItemOnPage, list.LastItemOnPage, list.TotalItemCount)); return WrapInListItem(text, options, "PagedList-pageCountAndLocation", "disabled"); }