Asp.net Core üzerinden sayfalama yapmının iki farklı yolu var bunlardan biri offset biride düz yani

mysql olmadan yapılan ancak mysql olmadan yaparsanız ms değeriniz fazlasıyla yüksek olacaktır 

bu yüzden size offset kullanarak pagination yapmayı göstereceğim.


İlk önce  Yeni bir Asp.net Core MVC Projesi açıyoruz veya devam eden projenize ekleyebilirsiniz.



PagedResult.cs classını açmamız gerekmetedir  açmak için Model  dosyasına sağ tıklayıp 

yeni item ekleye basınız açılan panelden classı seçip adını

 PagedResult yapınız sonuna .cs eklemeyi unutmayın!!



gelelim pagedresult classına yazacağımız kodlara ilk önce public class PagedResu

t yazan yeri şoyle değiştiriyoruz PagedResult<T> : List<T> ardından 

3 tane public oluşturacağız onun 

için prop yazıp 2 kez taba basıyoruz ve çıkacak olan  public int MyProperty { get; set; } 

bu kısmından  3 tane elde ediyoruz ve  bu şekilde değiştiriyoruz 


 public int PageIndex { get; set; }


 public int TotalCount{ get; set; }


 public int TotalPages{ get; set; }


ardından yeni bir method oluşturuyoruz.


public PagedResult(List<T> items, int totalCount, int pageSize, int pageIndex, int Count) {


PageIndex = pageIndex;

TotalCount = totalCount;

 TotalPages = (int)Math.Ceiling(Count / (double)pageSize);

 this.AddRange(items);


}


iki tane daha prop oluşturuyoruz ve aşağıdaki gibi değiştiriyoruz.


public bool  HasExitPage => pageIndex > 1;


public bool HasNextPage => pageIndex < TotalPages;


yeni bir static oluşturuyoruz 


publc static PagedResult<T> Create(List<T> source, int pageSize, int page Index, int Count) {


var count = source.Count;

var items = source.Skip((pageSize - 1) * 1).Take(pageSize).ToList();

return new PagedResult<T>(items, count, pageSize, pageİndex, totalCount);


}


Bu şekilde PagedResult Classını bitirmiş olduk.


Controller daki Index methodun Kodlarına başlayalım.

 Buraya geçmeden önce sql kısmındaki Offset kullanımdan bahsedeceğim.


Offsetin anlamanı sayfa sıralamadır ve bu özelik Micrasoft Sql Tarafından 2012 yılında eklenmiştir


Kullanımı



DECLARE @pageNumber INT = 1;

DECLARE @pageSize INT = 10;


Select Column Adı, ...... FROM Tablo Adı

ORDER BY SIRALANACAK OLAN COLUMUN ADI

Offset (@pageNumber - 1) * @pageSize ROWS

FETCH NEXT @pageSize ROWS ONLY;


Controller Kod tarafı

 int pageSize = 10;

int page = pageNumber ??  1;

int offset = (page * 1) -  pageSize;

Hataları kontrol etmek ve konsola yazdırmak için try catch kullanıyoruz

try 

 {


_context belirlemek için


 private readonly contextadınız  _context;

int totalCount = _context.Blogs.Count();

int totalPages =(int)Math.Ceiling((double)totalCount / pageSize);


bu kısımda bizi iki durum karşılıyor bunlardan biri son  sayfada ilerle butona basınca ilk 

sayfaya atması biri son sayfada ilerle butonun kapanması  

ikicisinde  size örnek olarak vereceğim siz birini kullanabilirsiniz.


Son Sayfadan ilk sayfaya yönlendirme,

    if (!pageNumber.HasValue || page < 1 || page > totalPages)

                {

                    // Geçersiz sayfa numarasına yönlendirme veya hata mesajı gönderme

                    return RedirectToAction("Index", new { pageNumber = 1 });

                }


 list<Blogs> blogs = _context.Blogs

.OrderBy(b => b.BlogID)

.Skip(offset)

.Take(pageSize)

.ToList();


buttonların gizlenmesi

               bool isLastPage = page == totalPages;

                ViewBag.IsLastPage = isLastPage;


                var FirstPage = 1;


                bool isFirstPage = page == FirstPage;

                ViewBag.IsFirstPage = isFirstPage;

      PagedResult<Blog> pagedResult = new PagedResult<Blog>(blogs, blogs.Count, page, pageSize, totalCount);

                return View(pagedResult);


}


Hatanın consola düşmesi

catch {

  Console.WriteLine("Hata: " + ex.Message);

                return View("Error");


}

Controller kodlarımız bitti şimdi size Index.cshtml kodlarınıza 

eklmeniz gereken kodları 

aşağıda yazıyorum


    @{


        var prevDisabled = !Model.HasExitPage ? "disabled" : "";

        var nextDisabled = !Model.HasNextPage ? "disabled" : "";


    }


    @if (!ViewBag.IsFirstPage)

    {

        <a asp-action="Index" asp-route-pageNumber="@(Model.PageIndex-1)" class="btn btn-dark @prevDisabled">

            <div class="container">

                <button class="exit">Geri</button>

            </div>

        </a>

    }


    @if (!ViewBag.IsLastPage)

    {

        <a asp-action="Index" asp-route-pageNumber="@(Model.PageIndex+1)" class="btn btn-dark @nextDisabled">

            <div class="container">

                <button class="next">Next</button>

            </div>

        </a>

    }






İşte bu kadar, sayfalama sistemi hazır durumda.


Başka BLoglarda görüşmek dileği ile




Image placeholder