How to implement pagination in asp.net core MVC C# (db First Approach EF-CORE) (Part-6)
Hello & As-salam u alikum ! , In this article we will learn to implement Pagination in asp.net core Razor page.
Note : For Beginner Guide Articles :
https://dotnetcorecommunity.blogspot.com/p/aspnet-core-tutorials-paracticals.html
Step# 1:
    
        Note : For Beginner Guide Articles :
https://dotnetcorecommunity.blogspot.com/p/aspnet-core-tutorials-paracticals.html
Step# 1:
Watch previous article for applying Search filer and display data on asp.net core view page from sql server table.
In last blog we had a Index Action method in Custom Controller which was like this .
-----------------------------------------------------------------------------------------------
[HttpGet]
        public async Task<IActionResult> Index(string sortOrder, string searchString)
        {
            ViewData["NameSortParm"] = String.IsNullOrEmpty(sortOrder) ? "name_desc" : "";
            ViewData["DateSortParm"] = sortOrder == "Date" ? "date_desc" : "Date";
            ViewData["CurrentFilter"] = searchString;
            var li = from s in db.TblUser
                     select s;
            if (!String.IsNullOrEmpty(searchString))
            {
                li = li.Where(s => s.UUserName.Contains(searchString)
                                       || s.UEmail.Contains(searchString));
            }
            switch (sortOrder)
            {
                case "name_desc":
                    li = li.OrderByDescending(s => s.UUserName);
                    break;
                case "Date":
                    li = li.OrderBy(s => s.UAddedDate);
                    break;
                case "date_desc":
                    li = li.OrderByDescending(s => s.UAddedDate);
                    break;
                default:
                    li = li.OrderBy(s => s.UUserName);
                    break;
            }
            return View(await li.AsNoTracking().ToListAsync());
        }
-----------------------------------------------------------------------------------------------
the above action method was perfect to sort, Search and display data from sql server table.
now I am going to make few changes for pagination in my Action method but before doing that we need to follow the step 2.
Step# 2:  
Previous Lesson                                                                                                Next Lesson
Right click on Model folder and add a new class and name it as "PaginatedList" .
Code Snippet: 
copy and paste the following code in your class.
--------------------------------------------------------------------------------------------------------
   public class PaginatedList<T> : List<T>
    {
        public int PageIndex { get; private set; }
        public int TotalPages { get; private set; }
        public PaginatedList(List<T> items, int count, int pageIndex, int pageSize)
        {
            PageIndex = pageIndex;
            TotalPages = (int)Math.Ceiling(count / (double)pageSize);
            this.AddRange(items);
        }
        public bool HasPreviousPage
        {
            get
            {
                return (PageIndex > 1);
            }
        }
        public bool HasNextPage
        {
            get
            {
                return (PageIndex < TotalPages);
            }
        }
        public static async Task<PaginatedList<T>> CreateAsync(IQueryable<T> source, int pageIndex, int pageSize)
        {
            var count = await source.CountAsync();
            var items = await source.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToListAsync();
            return new PaginatedList<T>(items, count, pageIndex, pageSize);
        }
    }
--------------------------------------------------------------------------------------------------------
Step# 3:  
Copy and the paste this below code in place of old index action method, a new input parameter of page number is added which will hold the page reference.
--------------------------------------------------------------------------------------------------------
    [HttpGet]
        public async Task<IActionResult> Index(string sortOrder, string searchString, string currentFilter, int? pageNumber)
        {
            ViewData["NameSortParm"] = String.IsNullOrEmpty(sortOrder) ? "name_desc" : "";
            ViewData["DateSortParm"] = sortOrder == "Date" ? "date_desc" : "Date";
            if (searchString != null)
            {
                pageNumber = 1;
            }
            else
            {
                searchString = currentFilter;
            }
            ViewData["CurrentFilter"] = searchString;
            var li = from s in db.TblUser
                     select s;
            if (!String.IsNullOrEmpty(searchString))
            {
                li = li.Where(s => s.UUserName.Contains(searchString)
                                       || s.UEmail.Contains(searchString));
            }
            switch (sortOrder)
            {
                case "name_desc":
                    li = li.OrderByDescending(s => s.UUserName);
                    break;
                case "Date":
                    li = li.OrderBy(s => s.UAddedDate);
                    break;
                case "date_desc":
                    li = li.OrderByDescending(s => s.UAddedDate);
                    break;
                default:
                    li = li.OrderBy(s => s.UUserName);
                    break;
            }
            int pageSize = 3;
            return View(await PaginatedList<TblUser>.CreateAsync(li.AsNoTracking(), pageNumber ?? 1, pageSize));
            //  return View(await li.AsNoTracking().ToListAsync());
        }
--------------------------------------------------------------------------------------------------------
Step# 4:  
Go to the view page of this action method . just right click on Index method and select go to view and paste the below html code : 
------------------------------------------------------------------------------------------
@model PaginatedList<WebApplication7.Models.TblUser>
@{
    ViewData["Title"] = "Index";
}
    <div style="border:1px solid black;box-shadow:13px 9px 32px 2px blanchedalmond;padding:10px;">
        <a asp-action="Create" class="btn btn-primary btn-block">Create New</a>
        <form asp-action="Index" method="get">
            <div class="form-actions no-color">
                <p style="margin-top:20px">
                    <input type="text" name="SearchString" value="@ViewData["currentFilter"]" />
                    <input type="submit" value="Search" class="btn btn-outline-success btn-sm" /> |
                    <a asp-action="Index">Back to Full List</a>
                </p>
            </div>
        </form>
        @if (Model == null)
        {
            <h1 style="color:red;text-align:center">No data Found</h1>
        }
        else
        {
            <table class="table table-responsive">
                <thead>
                    <tr>
                        <th>ID</th>
                        <th>Image</th>
                        <th>
                            <a asp-action="Index" asp-route-sortOrder="@ViewData["NameSortParm"]"> <span class="glyphicon glyphicon-sort"> Name</span>  </a>
                        </th>
                        <th>Email</th>
                        <th>
                            <a asp-action="Index" asp-route-sortOrder="@ViewData["DateSortParm"]"> <span class="glyphicon glyphicon-sort"> Added Date</span>  </a>
                        </th>
                        <th>Is Login</th>
                        <th>Is Approved</th>
                        <th>Details</th>
                    </tr>
                </thead>
                <tbody>
                    @foreach (var item in Model)
                    {
                        <tr>
                            <td>@item.UId</td>
                            <td><img src="~/img/@item.UProfilePicture" style="height:70px;width:70px;" /></td>
                            <td>@item.UUserName</td>
                            <td>@item.UEmail</td>
                            <td>@item.UAddedDate</td>
                            <td>@item.UIsuserlogin</td>
                            <td>@item.UIsuseraproved</td>
                            <td>
                                <a asp-action="Details" asp-route-id="@item.UId">Details</a>
                            </td>
                        </tr>
                    }
                </tbody>
            </table>
        }
        @{
            var prevDisabled = !Model.HasPreviousPage ? "disabled" : "";
            var nextDisabled = !Model.HasNextPage ? "disabled" : "";
        }
        <a asp-action="Index"
           asp-route-sortOrder="@ViewData["CurrentSort"]"
           asp-route-pageNumber="@(Model.PageIndex - 1)"
           asp-route-currentFilter="@ViewData["CurrentFilter"]"
           class="btn btn-default @prevDisabled">
            Previous
        </a>
        <a asp-action="Index"
           asp-route-sortOrder="@ViewData["CurrentSort"]"
           asp-route-pageNumber="@(Model.PageIndex + 1)"
           asp-route-currentFilter="@ViewData["CurrentFilter"]"
           class="btn btn-default @nextDisabled">
            Next
        </a>
    </div>
------------------------------------------------------------------------------------------
The highlighted lines represents the changes which I made in view to apply Pagination.
Conclusion : There you go to use pagination  on your view page. Thank you for reading ,Have a good day ! In the next article we will learn to apply create or add new records  in asp.net core.
Reference :
https://docs.microsoft.com/en-us/aspnet/core/data/ef-mvc/sort-filter-page?view=aspnetcore-3.0
Reference :
https://docs.microsoft.com/en-us/aspnet/core/data/ef-mvc/sort-filter-page?view=aspnetcore-3.0






1 Comments:
very easy and helpful blog
Post a Comment
Do not Add Spam links in the Comment Box
Subscribe to Post Comments [Atom]
<< Home