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

自古美人都是妖i 提交于 2019-12-05 16:38:38

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

Include X.PagedList.Mvc.Core nuget in your project. Then add this to your view:

@using X.PagedList.Mvc.Core

Then this should work:

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

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);
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!