وبلاگ شخصی حامد شیربندی

حامد شیربندی

توسعه دهنده نرم افزار

پیاده سازی Pagination در ASP.NET Core MVC با دریافت دیتا به صورت تکه تکه از دیتابیس

برای پیاده سازی Pagination یا همان صفحه بندی در برنامه های مبتنی بر ASP.NET Core MVC لایبری های زیادی وجود دارند اما مشکل اکثر آنها این است که ابتدا کل دیتا را از دیتابیس واکشی و سپس آن را در حافظه صفحه بندی میکنند که در مورد دیتاهایی که تعداد رکورد های آنها بسیار بالاست این مورد به هیچ وجه عملکرد مناسبی ندارد.

در این مقاله به معرفی لایبری MvcPagedList.Core خواهیم پرداخت که به کمک آن میتوانیم Pagination را به صورتی پیاده کنیم که در هر لحظه فقط رکوردهای مورد نیاز از دیتابیس واکشی شوند. از دیگر مزیت های این لایبری هم این است که Pagination را میتوان با یک تنظیم ساده هم به صورت Ajax پیاده کرد و هم به صورت غیر Ajax

برای شروع کافی است پکیج مربوط به MvcPagedList.Core را به صورت زیر از طریق Nuget در برنامه نصب کنید:


pm> Install-Package MvcPagedList.Core

سپس میتوانید به مخزن کدهای این لایبری بر روی github مراجعه کنید و نحوه ی پیاده سازی کدهای آن را بررسی کرده و یا از خو پروژه ی مثال آن استفاده کنید.

شکل کلی کار به این صورت است که دو اکش Index و Search را در کنترلر ایجاد میکنید که در این اکشن ها حتما می بایست چند ViewBag را به شکل زیر مقدار دهی کنید که مورد استفاده ی این لایبری قرار میگیرند:


 ViewBag.PageSize = pageSize;
 ViewBag.CurrentPage = page;
 ViewBag.TotalItemCount = totalItemCount;

سپس کافی ست طبق پروژه ی مثال، ویو های مربوطه را نیز پیاده سازی کنید و در نهایت برای تولید Pagination کافی است متد زیر را در انتهای ویو فراخوانی کنید :

@using MvcPagedList.Core;

@PagedList.Pager(actionName: "search", controllerName: "home", areaName:"",
 routeValues: new
 {
 term = Context.Request.Query["term"],
 sortOrder = Context.Request.Query["sortOrder"],
 sortBy = Context.Request.Query["sortBy"],

 },
 ajaxAttributes: new
 {
 data_ajax = "true",
 data_ajax_loading = "#global-ajax-loading",
 data_ajax_update = "#ajax-show-list",
 data_ajax_method = "GET",
 data_ajax_mode = "replace"


 },
 pagerOptions: new PagerOptions
 {
 currentPage = (int)ViewBag.CurrentPage,
 PageCount = (int)ViewBag.PageSize,
 TotalItemCount = (int)ViewBag.TotalItemCount,
 DisplayMode = PagedListDisplayMode.IfNeeded,
 DisplayInfoArea = true,
 LinkToNextPageFormat = "next",
 LinkToPreviousPageFormat = "prev",
 CurrentLocationFormat = "page",
 PageCountFormat = "of",
 TotalItemCountFormat = "total count",
 WrapperClasses = "text-center",

 } )



همانطور که میبینید سه ViewBagی که در کنترلر مقدار دهی کرده بودیم مورد استفاده ی آن قرار میگیرد و همچنین میتوانیم متن های نمایش داده شده در Pagination تولید شده را هم مدیریت کنیم.

یک نکته اینکه اگر نمیخواهیم عملیات به صورت Ajax ی انجام شود کافی است تا در متد بالا مقدار ajaxAttributes را برابر null قرار دهیم.در نهایت خروجی کار به شکل زیر خواهد بود :


نوشته شده توسط حامد شیربندی

اگر در مورد این نوشته سوال یا ابهامی وجود دارد میتوانید به ایمیل من ارسال کنید. البته در این مورد باید کمی صبور باشید. در آینده بخش نظرات اضافه خواهد شد.