2014-09-06 2 views
4

Я использую PagedList.Mvc для подкачки в моем приложении MVC 5.Кнопка PagedList.Mvc ellipsis не работает

Вопрос: Кнопка с многоточием, которая после страницы № 10 на скриншоте снизу, ничего не делает при нажатии. Так ли это должно быть, или я могу заставить кнопку многоточия работать так, чтобы она отображала следующий набор страниц?

Ellipsis button does nothing

HTML-хелперов используется в представлении для отображения этого пейджера, как показано ниже.

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

ответ

2

Решение, которое сработало, состоит в том, чтобы скрыть кнопку многоточия.

РЕШЕНИЕ

Это решение включает в себя скрытие кнопку с многоточием. Для этого вам нужно убедиться, что для свойства DisplayEllipsesWhenNotShowingAllPageNumbers под классом PagedListRenderOptions установлено значение false, поскольку по умолчанию оно истинно. Его настройка приводит к тому, что пейджер показывает кнопку многоточия.

фрагмент кода приведен ниже будет идти в ваш View или PartialView HTML, и вам нужно будет изменить некоторые из пользовательских параметров, таких как SortOrder и имя действия и т.д.

Скрыть кнопку Многоточие при пейджере ajaxified

@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" })) 

Скрыть кнопку Многоточие при пейджере, не ajaxified

@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 со следующим кодом. В этом коде всего 2 изменения, и это две строки, вставленные непосредственно перед прокомментированной строкой //listItemLinks.Add(Ellipses(options));. В методе, где эта строка появилась в исходном коде, есть 2 места, и они были прокомментированы и заменены вызовами новых методов, определенных в приведенном выше фрагменте кода.

///<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

+0

Отлично. Я счастлив, что мой код помог.Во втором решении всегда будет отображаться кнопка с многоточием, но кнопка с многоточием всегда будет показывать следующую или предыдущую запись x и не будет отключена. – Sunil

Смежные вопросы