Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PagedList.Core.Mvc PagedListPager Html extension in .Net Core is not there

It seems like the PagedList.Core does not contain the extension method for Html helper, so I cannot use the code below:

@Html.PagedListPager(Model, page => Url.Action("Index", new { page }), PagedListRenderOptions.MinimalWithItemCountText)

I was able to successfully implement the paging in previous version of MVC, but it does not work in ASP.Net Core. Below I have attached IL Dasm reference. Am I missing something, or is there any other way to implement that?

PagedList.Mvc:

enter image description here

PagedList.Core.Mvc:

enter image description here

like image 441
lucas Avatar asked Jan 07 '17 02:01

lucas


2 Answers

To use PagedList in .Net Core 3.0 we will use https://github.com/dncuug/X.PagedList

Open NuGet Package Manager Install X.PagedList.Mvc.Core

_ViewImports.cshtml

@using X.PagedList.Mvc.Core;
@using X.PagedList;
@using X.PagedList.Mvc.Common

BrandController.cs

public ActionResult Index(int? page)
{
   var pageNumber = page ?? 1;
   var pageSize = 10; //Show 10 rows every time
   var brands = this._UoW.BrandsRepository.GetAll().ToPagedList(pageNumber,pageSize);
   return View(brands);
}

Index.cshtml

Change

@model IEnumerable<Stock.Data.Models.Brands>

to

@model IPagedList<Stock.Data.Models.Brands>

Change every

@Html.DisplayNameFor(model => model.BrandName)

To

@Html.DisplayNameFor(model => model.First().BrandName)

At the the end of your html table add paging numbers like

<div class="pull-right">
                @Html.PagedListPager((IPagedList)Model, page => Url.Action("Index",
                   new
                        {
                            page
                 }),
                 new PagedListRenderOptionsBase
                 {
                     LiElementClasses = new string[] { "page-item" },
                     PageClasses = new string[] { "page-link" },
                     Display = PagedListDisplayMode.IfNeeded

                      })
            </div>

If you make search or using other querystring you have to do something like that:

BrandController.cs

public ActionResult Index(string search,int? page)
{
   var pageNumber = page ?? 1;
   var pageSize = 10; //Show 10 rows every time
   var brands = this._UoW.BrandsRepository.GetAll().Where(b => 
                b.BrandName.Contains(search) ||
                search == null).ToPagedList(pageNumber, pageSize);
            return View(brands);
}

Index.cshtml At the the end of your html table add paging numbers like

            <div class="pull-right">
                @Html.PagedListPager((IPagedList)Model, page => Url.Action("Index",
                   new
                        {
                            page,
                   search = Context.Request.Query["search"]
                 }),
                 new PagedListRenderOptionsBase
                 {
                     LiElementClasses = new string[] { "page-item" },
                     PageClasses = new string[] { "page-link" },
                     Display = PagedListDisplayMode.IfNeeded

                      })
            </div>

For best performance use

.ToPagedList with IQueryable

so you will return only 10 rows from the database every time not the whole rows

Use

        public IQueryable<T> GetAll()
        {
            return this._DbSet;
        }

with

this._UoW.BrandsRepository.GetAll().ToPagedList(pageNumber,pageSize);

Do not use .ToList()

this._UoW.BrandsRepository.GetAll().ToList().ToPagedList(pageNumber,pageSize);

Do not use

        public IEnumerable<T> GetAll()
        {
            return this._DbSet;
        }

with

this._UoW.BrandsRepository.GetAll().ToPagedList(pageNumber,pageSize);
like image 77
Mohamed Elamin Avatar answered Jan 04 '23 06:01

Mohamed Elamin


I should follow the Instructions of the new version, it is a little different from previous version. I was able to implement the paging with the following code changes:

Startup.cs:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();
    }

_ViewImports.cshtml:

@addTagHelper *, PagedList.Core.Mvc

And finally to use it, we don't use Html tag helper anymore in .Net Core:

<pager class="pager-container" list="@Model" options="@PagedListRenderOptions.TwitterBootstrapPager" asp-action="Index" asp-controller="ControllerName" />
like image 21
lucas Avatar answered Jan 04 '23 05:01

lucas