PagedList is a library that enables you to easily take an IEnumerable/IQueryable, chop it up into "pages", and grab a specific "page" by an index. PagedList.Mvc allows you to take that "page" and display a pager control that has links like "Previous", "Next", etc.
- Install "PagedList.Mvc" via NuGet - that will automatically install "PagedList" as well.
- In your controller code, call ToPagedList off of your IEnumerable/IQueryable passing in the page size and which page you want to view.
- Pass the result of ToPagedList to your view where you can enumerate over it - its still an IEnumerable, but only contains a subset of the original data.
- Call Html.PagedListPager, passing in the instance of the PagedList and a function that will generate URLs for each page to see a paging control.
/Controllers/ProductController.cs
public class ProductController : Controller { public object Index(int? page) { var products = MyProductDataSource.FindAllProducts(); //returns IQueryable<Product> representing an unknown number of products. a thousand maybe? var pageIndex = page ?? 0; // if no page was specified in the querystring, default to page 0 var onePageOfProducts = products.ToPagedList(pageIndex, 25); // will only contain 25 products max because of the pageSize ViewBag.OnePageOfProducts = onePageOfProducts; return View(); } }
/Views/Products/Index.cshtml
@{ ViewBag.Title = "Product Listing" } @using PagedList.Mvc; //import this so we get our HTML Helper @using PagedList; //import this so we can cast our list to IPagedList (only necessary because ViewBag is dynamic) <!-- import the included stylesheet for some (very basic) default styling --> <link href="/Content/PagedList.css" rel="stylesheet" type="text/css" /> <!-- loop through each of your products and display it however you want. we're just printing the name here --> <h2>List of Products</h2> <ul> @foreach(var product in ViewBag.OnePageOfProducts){ <li>@product.Name</li> } </ul> <!-- output a paging control that lets the user navigation to the previous page, next page, etc --> @Html.PagedListPager( (IPagedList)ViewBag.OnePageOfProducts, page => Url.Action("Index", new { page }) )
Code to generate the above configurations:
<h3>Default Paging Control</h3> @Html.PagedListPager((IPagedList)ViewBag.OnePageOfProducts, page => Url.Action("Index", new { page = page })) <h3>Minimal Paging Control</h3> @Html.PagedListPager((IPagedList)ViewBag.OnePageOfProducts, page => Url.Action("Index", new { page = page }), PagedListRenderOptions.Minimal) <h3>Minimal Paging Control w/ Page Count Text</h3> @Html.PagedListPager((IPagedList)ViewBag.OnePageOfProducts, page => Url.Action("Index", new { page = page }), PagedListRenderOptions.MinimalWithPageCountText) <h3>Minimal Paging Control w/ Item Count Text</h3> @Html.PagedListPager((IPagedList)ViewBag.OnePageOfProducts, page => Url.Action("Index", new { page = page }), PagedListRenderOptions.MinimalWithItemCountText) <h3>Page Numbers Only</h3> @Html.PagedListPager((IPagedList)ViewBag.OnePageOfProducts, page => Url.Action("Index", new { page = page }), PagedListRenderOptions.PageNumbersOnly)
You can instantiate PagedListRenderOptions yourself to create custom configurations. All elements/links have discrete CSS classes applied to make styling easier as well.
Licensed under the MIT License.