Provides a simple framework for handling data pagination from within any kind of .NET system.
ByteDev.Pagination has been written as a .NET Standard 2.0 library, so you can consume it from a .NET Core or .NET Framework 4.6.1 (or greater) application.
ByteDev.Pagination is hosted as a package on nuget.org. To install from the Package Manager Console in Visual Studio run:
Install-Package ByteDev.Pagination
Further details can be found on the nuget page.
The project is broken into two main namespaces: Data and Presentation.
Types in the Data namespace are concerned with getting a paginatable representation of your required data set.
DataPagingInfo
represents the input data required for pagination by the repository/DAL layer.
EntitiesPagingContainer
represents the output data returned from a repository/DAL layer.
Example usage from within a repository class:
public class CustomerRepository
{
public EntitiesPagingContainer<Customer> GetBySurname(string surname, DataPagingInfo pagingInfo)
{
var count = _dal.Customers.Count(c => c.Surname == surname);
var customers = _dal.Customers.Where(c => c.Surname == surname)
.OrderByDescending(c => c.DateTimeCreated)
.Skip(pagingInfo.Skip)
.Take(pagingInfo.PageSize)
.ToList();
return new EntitiesPagingContainer<Customer>(customers, count, pagingInfo);
}
}
Types in the Presentation namespace are concerned with how you wish to handle pagination in the presentation layer/UI.
Once we have got a EntitiesPagingContainer
back from the repository it needs to be converted to a PaginationPageViewModel
. PaginationPageViewModel
represents a container for all the possible requirements for pagination. It can easily be used as a Model for a MVC View/PartialView.
For example:
@model ByteDev.Pagination.Presentation.PaginationPageViewModel
@if (Model.HasMoreThanOnePage)
{
<div>
@if (Model.IsFirstPage)
{
<span><<</span>
<span><</span>
}
else
{
<a href="@Url.Action("Index", "Home", new {pageNumber = Model.FirstPageNumber})"><<</a>
<a href="@Url.Action("Index", "Home", new {pageNumber = Model.PreviousPageNumber})"><</a>
}
@foreach (var pageNumber in Model.PageNavigationNumbers)
{
if (pageNumber.IsCurrentPage)
{
<span>@pageNumber.DisplayNumber</span>
}
else
{
<a href="@Url.Action("Index", "Home", new {pageNumber = pageNumber.Number})">@pageNumber.DisplayNumber</a>
}
}
@if (Model.IsLastPage)
{
<span>></span>
<span>>></span>
}
else
{
<a href="@Url.Action("Index", "Home", new {pageNumber = Model.NextPageNumber})">></a>
<a href="@Url.Action("Index", "Home", new {pageNumber = Model.LastPageNumber})">>></a>
}
</div>
}
For further example details see the ByteDev.Pagination.WebUi project.