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