ASP NET CORE RAZOR PAGE BAKIM TEKNİK SERVİS PROJESİ DERS 020 PAGINATION İŞLEMİ

Son dersimizde custom tag helperimizin yapımını tamamlamıştık. Ana yapıyı tamamladık ancak henüz her şey bitmiş değil. Benim PagingInfo classım içerisinde toplam sayfa sayım, her sayfa başına gösterilecek öğe sayım, güncel sayfam, toplam kullanıcı sayım yani toplam öğem gibi propertylerim mevcut. Eğer ben bu pagination işlemini yapmak istiyor isem, modelimin için de bi şeyler yapmam lazım.

İlgili video ders:

ViewModel Oluşturma

Burada Models içinde ViewModel yani, bir görünüm modeli oluşturacağım. Models klasörüm içine geliyorum bir klasör oluşturuyorum adını da ViewModel verdim. ViewModel nedir, view model modellerin bir kombinasyonu olarak düşünebilir. ViewModel içindeki özelliklerin veritabanım ile ilişkisi olmayacak. ViewModel içine geliyorum ve yeni bir class ekliyorum adını da UsersListViewModel.cs verdim. Kodlarımı yazıyorum.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace GursoyCNCBakim.Models.ViewModel
{
    public class UsersListViewModel
    {
        public List ApplicationUserList { get; set; }
        public PagingInfo PagingInfo { get; set; }
    }
}

Buradaki view model içinde iki tane property tanımladım. Buraya istediğimiz kadar property ekleyebiliriz. Şimdilik bizim işimizi bunlar görmekte.

Daha sonra Pages > Kullanicilar > Index.cshtml.cs içine gelip değişiklik işlemimi yapıyorum.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using GursoyCNCBakim.Data;
using GursoyCNCBakim.Models;
using GursoyCNCBakim.Models.ViewModel;
using GursoyCNCBakim.Utility;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.EntityFrameworkCore;

namespace GursoyCNCBakim.Pages.Kullanicilar
{
    public class IndexModel : PageModel
    {
        private readonly ApplicationDbContext _db;

        public IndexModel(ApplicationDbContext db)
        {
            _db = db;
        }

        [BindProperty]
        public UsersListViewModel UsersListViewModel { get; set; }

        public async Task< IActionResult > OnGet(int productPage = 1)
        {
            UsersListViewModel = new UsersListViewModel()
            {
                ApplicationUserList = await _db.ApplicationUser.ToListAsync()
            };

            StringBuilder param = new StringBuilder();
            param.Append("/Kullanicilar?productPage=:");

            var sayi = UsersListViewModel.ApplicationUserList.Count;

            UsersListViewModel.PagingInfo = new PagingInfo()
            {
                CurrentPage = productPage,
                ItemsPerPage = 5,
                TotalItems = sayi,
                UrlParam = param.ToString()
            };

            UsersListViewModel.ApplicationUserList = UsersListViewModel.ApplicationUserList.OrderBy(a => a.Email).Skip((productPage - 1) * StatikRoller.5).Take(StatikRoller.5).ToList();

            return Page();
        }
    }
}


Burada UserListViewModel’i modelimiz olarak tanımladık.

OnGet metodum içinde kullanıcıları listeleyebilmek için kodlarımı yazdım. İlgili url’in yani sayfalama işlemimde url adresinin oluşturulabilmesi için StringBuilder’den param adında bir nesne türettim. Bu nesneme url adresimin ne şekilde olacağını belirttim. Bu arada ben artık toplam sayfa bilgisini de tutmak için sayi adında değişken tanımladım. Akabinde PagingInfo classımdan yararlanarak elde ettiğim bilgileri kendi propertylerime assign işlemi yapıyorum. Ek olarak dikkat ederseniz OnGet metodumda default olarak parametre değeri productPage = 1 diyerek başlangıç, default değerimi de atadım. Ben her sayfa başına 5 öğe gösterilmesini istediğim, istediğiniz gibi değiştirebilirsiniz.

Daha sonra diyelim ki benim 13 tane kullanıcım var, ben ilk 5’i gösterdim, ikinci sayfada ikinci 5’i göster şeklinde işlemi yaptırabilmek için burada da kodlarımı yazdım.

Benim burada ItemsPErPage = 5 yazmam çok mantıklı değil. İlerleyen zamanda daha farklı sayıda kullanıcı göstermek istiyor isem buraya gelip bunları değiştirmem yazılım mantığına aykırı. Çünkü birden fazla noktada değişim yapmam gerek. Dolayısı ile ben bunu tek bir noktadan değiştirecek şekilde yapmalıyım. Bir değişken içinde bir sabit değişken içinde tanımlayabilirim. Dolayısı ile, Utility klasörü altında yer alan StatikRoller.cs dosyam içinde yeni bir sabit tanımlıyorum.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace GursoyCNCBakim.Utility
{
    public static class StatikRoller
    {
        public const string AdminKullanici = "Admin";
        public const string MusteriKullanici = "Musteri";
        public const int KullaniciSayfalamaSayfaBoyutu = 5;
    }
}

Tekrar Pages > Kullanicilar > Index.cshtml.cs içine geliyorum ve değişikliklerimi yapıyorum.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using GursoyCNCBakim.Data;
using GursoyCNCBakim.Models;
using GursoyCNCBakim.Models.ViewModel;
using GursoyCNCBakim.Utility;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.EntityFrameworkCore;

namespace GursoyCNCBakim.Pages.Kullanicilar
{
    public class IndexModel : PageModel
    {
        private readonly ApplicationDbContext _db;

        public IndexModel(ApplicationDbContext db)
        {
            _db = db;
        }

        [BindProperty]
        public UsersListViewModel UsersListViewModel { get; set; }

        public async Task< IActionResult > OnGet(int productPage = 1)
        {
            UsersListViewModel = new UsersListViewModel()
            {
                ApplicationUserList = await _db.ApplicationUser.ToListAsync()
            };

            StringBuilder param = new StringBuilder();
            param.Append("/Kullanicilar?productPage=:");

            var sayi = UsersListViewModel.ApplicationUserList.Count;

            UsersListViewModel.PagingInfo = new PagingInfo()
            {
                CurrentPage = productPage,
                ItemsPerPage = StatikRoller.KullaniciSayfalamaSayfaBoyutu,
                TotalItems = sayi,
                UrlParam = param.ToString()
            };

            UsersListViewModel.ApplicationUserList = UsersListViewModel.ApplicationUserList.OrderBy(a => a.Email).Skip((productPage - 1) * StatikRoller.KullaniciSayfalamaSayfaBoyutu).Take(StatikRoller.KullaniciSayfalamaSayfaBoyutu).ToList();

            return Page();
        }
    }
}.

Böylelikle ilerleyen zamanlarda diyelim ki her sayfa 10 tane kullanıcı göstermek istiyor isem bu sefer sadece ilgili sabitimi değiştirmem yeterli olacak.

Şimdilik bu kadar, video eğitime mutlaka bakın derim. Daha detayı görebilirsiniz. Görüşmek üzere.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir