2014-09-06 145 views
4

我正在使用PagedList.Mvc在我的MVC 5应用程序中进行分页。PagedList.Mvc省略号按钮不起作用

问题:省略号按钮在下面的屏幕截图中的第10页后面,单击时不会执行任何操作。这是它应该如何,或者我可以使省略号按钮工作,因此点击它会显示下一组页面?

Ellipsis button does nothing

的HTML帮助中所使用的视图显示该寻呼机是如下。

@Html.PagedListPager(Model, page => Url.Action("Index", 
new { page, sortOrder = ViewBag.CurrentSort, SearchText = ViewBag.SearchText })) 

回答

2

工作的解决方案是隐藏省略号按钮。

SOLUTION

该解决方案涉及隐藏省略号按钮。为此,您需要确保PagedListRenderOptions类下DisplayEllipsesWhenNotShowingAllPageNumbers的属性设置为false,因为默认情况下它的属性为true。它的这个设置导致寻呼机显示省略号按钮。

下面给出的代码片段将进入您查看或PartialView HTML,你将需要改变一些像中将sortOrder和动作名称等

隐藏省略号按钮自定义参数时,寻呼机被Ajax化

@Html.PagedListPager(Model, 
page => Url.Action("GetOrderDetails", new { page, sortOrder = ViewBag.CurrentSort, 
, command = "paging", PageSize = ViewBag.PageSize }), 
PagedListRenderOptions.EnableUnobtrusiveAjaxReplacing( 
new PagedListRenderOptions { DisplayEllipsesWhenNotShowingAllPageNumbers = false}, 
new AjaxOptions() { HttpMethod = "POST", UpdateTargetId = "gridTable", 
OnBegin = "OnBegin", OnSuccess = "OnSuccess" })) 

隐藏省略号按钮时寻呼机被非Ajax化

@Html.PagedListPager(Model, page => Url.Action("Index", new { page, 
sortOrder = ViewBag.CurrentSort, command = "paging", PageSize = ViewBag.PageSize}), 
new PagedListRenderOptions { DisplayEllipsesWhenNotShowingAllPageNumbers = false }) 

另一种解决方案

下载从GitHub源代码在https://github.com/troygoode/PagedList并打开Visual Studio中的解决方案。

HtmlHelper.cs类中添加以下2种方法。

private static TagBuilder PreviousEllipsis(IPagedList list, Func<int, string> generatePageUrl, PagedListRenderOptions options, int firstPageToDisplay) 
    { 
     var targetPageNumber = firstPageToDisplay - 1;//list.PageNumber - 1; 
     var previous = new TagBuilder("a") 
     { 
      InnerHtml = string.Format(options.EllipsesFormat, 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"); 
    } 
    private static TagBuilder NextEllipsis(IPagedList list, Func<int, string> generatePageUrl, PagedListRenderOptions options, int lastPageToDisplay) 
    { 
     var targetPageNumber = lastPageToDisplay + 1;// list.PageNumber +1; 
     var next = new TagBuilder("a") 
     { 
      InnerHtml = string.Format(options.EllipsesFormat, 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"); 
    } 

在同一HtmlHelper.cs,用下面的代码替换的PagedListPager现有方法。这段代码只有两处变化,这两条线是在注释行//listItemLinks.Add(Ellipses(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) 
    { 
     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(PreviousEllipsis(list, generatePageUrl, options, firstPageToDisplay)); 
       //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(NextEllipsis(list, generatePageUrl, options, lastPageToDisplay)); 
       //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(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()); 
    } 

然后,重建代码并通过dll复制到bin文件夹。在此之后,您会发现省略号按钮处于启用状态,并会将您带到当前页码的第一页之前的页面或当前设置之后的页面。我测试了这个,它工作。

+0

使用您的代码来禁用非... ...页面的“...”按钮。它效果很好。谢谢。 – CowboyBebop 2015-10-23 16:19:15

+0

太好了。我很高兴我的代码得到了帮助。第二种解决方案将始终显示省略号按钮,但省略号按钮将始终显示下一个或前一个x记录,而不是禁用。 – Sunil 2015-10-23 20:55:35