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
