Mini Dükkan Projesi Ders 005 Ürünlerin Listelenmesi

Şu ana kadar ilk ayarların çok uzun sürdüğünün farkındayım ancak iyi durumdan bahsedeyim, bundan sonra işlerimi daha kolay ve daha hızlı bir şekilde olacak inşallah.

Daha detaylı kısım için videoya göz atabilirsiniz.

Öncelikle ilgili controller yazımı ile işe başlayalım. HomeController’a geliyorum ve düzenlemelerimi gerçekleştiriyorum.

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using MiniDukkan.Models;

namespace MiniDukkan.Controllers
{
    public class HomeController : Controller
    {
        private IDukkanRepository repository;
       

        public HomeController(IDukkanRepository repo)
        {
            repository = repo;
        }

       


        //private readonly ILogger< HomeController > _logger;

        //public HomeController(ILogger< HomeController > logger)
        //{
        //    _logger = logger;
        //}

        public IActionResult Index()
        {
            return View(repository.Urunler);
        }


        public ViewResult Index(int urunSayfa = 1)
        => View(repository.Urunler.OrderBy(u => u.UrunID).Skip((urunSayfa - 1) * SayfaBoyutu).Take(SayfaBoyutu));
        
        
        

        //public IActionResult Privacy()
        //{
        //    return View();
        //}

        //[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
        //public IActionResult Error()
        //{
        //    return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
        //}
    }
}

Yazdığımız kod içerisinde görüleceği üzere ASP.NET Core; bir http isteğini işlemek için HomeController classından yeni bir instance alınmasına ihtiyaç duymaktadır. Bunu gerçekleştirebilmek için bir constructor oluşturdum ve IDukkanRepository interface’i ile repo adında bir nesne türettim. Bu yapıda ASP.NET Core tarafından hangi uygulama classının kullanılacağına dair bilgi startup classı üzerinden edinilir. Bizim örneğimizde buna göre EFDukkanRepository kullanılmaktadır. Ve her yeni bir istekte yeni bir nesne türetilmektedir. Böylelikle ASP.NET Core tarafından her istekte yeni bir EFDukkanRepository nesnesi oluşturulur ve bu nesne http isteğini işleyecek olan controller nesnesinin oluşturulması için HomeController constructor’ı çağırır. İşte bu durum Dependency Injection yani bağımlılık ekleme olarak bilinir. Böylelikle HomeController nesnesinin, hangi uygulama sınıfının yapılandırıldığını bilmeden IDukkanRepository arabirimi aracılığıyla uygulamanın repository’sine erişmesine olanak tanır. Bazı yazılım geliştirmeci arkadaşlar dependency injection kullanmayı sevmezler çünkü uygulamaları daha karmaşık hale getirdiğine inanırlar. Ama bu işte yeni iseniz bence dependency injection kullanın derim.

View’i Güncelleyelim:

Şimdi daha önce eklediğimiz veleri Index sayfasında görebilmek için Index sayfasını güncelleyelim. Var olan başlık kodunu silin. aşağıdaki kodları ekleyin.

@model IQueryable< Urun >

@foreach (var u in Model)
{
    

@u.UrunAd

@u.Aciklama

@u.Fiyat.ToString("c")

}

Buradaki kodlarım başında yer alan @model ifadesi ile ben model verileri olarak action metodundan ürün dizisi almayı beklediğimi belirtiyorum. Daha sonra dizi üzerinde çalışmak ve her bir dizi elemanına ait ilgili html kodlarım için @foreach kullanıyorum.  Burada benim bu view sayfam ürünün nereden geldiğini, nasıl geldiğini ve tüm ürünlerin temsil edip edilmediği ile ilgilenmez. Bunu uygulama tarafım bilmektedir. Burada view’in amacı ürünün html olarak nasıl görüntüleneceği ile ilgilidir. Kodlarım içinde Fiyat özelliği için ToString metodu içinde “c” kullandım, bunun sebebi nümerik değerin string olarak işlenmesi ancak ilgili sistem ayarlarına göre parasal birim şeklinde gösterilmesi içindir.

Uygulamayı çalıştırdığımızda bir önceki derste eklediğimiz tüm veriler bir html sayfasında listelenir.

Pagination İşlemi (Sayfalandırma İşlemi)

Şimdi benim Index.cshtml sayfam benim tüm ürünleri tek bir sayfada listeliyor. Şimdi bunu gelin sayfalandırma dediğimiz pagination işlemi ile değiştirelim. Böylelikle bir sayfa içinde belirli sayıda ürün gösterilsin ve birden fazla sayfaya ürünlerimiz dağılsın. HomeController üzerinde düzenleme yapalım.

HomeControllera geliyorum ve kodlarımı aşağıdaki gibi düzenliyorum:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using MiniDukkan.Models;

namespace MiniDukkan.Controllers
{
    public class HomeController : Controller
    {
        private IDukkanRepository repository;
        public int SayfaBoyutu = 3;

        public HomeController(IDukkanRepository repo)
        {
            repository = repo;
        }

       


        //private readonly ILogger< HomeController > _logger;

        //public HomeController(ILogger< HomeController > logger)
        //{
        //    _logger = logger;
        //}

        //public IActionResult Index()
        //{
        //    return View(repository.Urunler);
        //}


        public ViewResult Index(int urunSayfa = 1)
        => View(repository.Urunler.OrderBy(u => u.UrunID).Skip((urunSayfa - 1) * SayfaBoyutu).Take(SayfaBoyutu));
        
        
        

        //public IActionResult Privacy()
        //{
        //    return View();
        //}

        //[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
        //public IActionResult Error()
        //{
        //    return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
        //}
    }
}

Kodlarım içinde SayfaBoyutu ile ben her sayfada 3 ürün gösterilecek diyorum. Index metoduma isteğe bağlı bir parametre daha ekledim. Böylelikle eğer metot parametre olmadan çağırılırsa ilk sayfanın yani 1. Sayfanın gösterilmesini sağlıyorum. Kodlarımın devamında da ürün nesnelerimi primary key alanlarına göre sıralıyorum, her bir sayfada 3tane gösterilmesini sağlıyorum, daha önceki sayfada gösterilenlerin bir daha gösterilmemesi için skip kullanıyor ve formülümü yazıyorum.

Şimdi uygulamamızı çalıştıralım. İlk sayfamda görüleceği üzere 3 ürün görünmekte.

İkinci sayfaya nasıl geçeceğiz, şöyle yazalım tarayıcı kısmına http://localhost:5000/?urunSayfa=2 yazarsak 2. sayfaya ulaşırız.

Böylelikle ikinci sayfamdaki ürünler gelir.

Peki böyle mi kalacak, tabii ki tarayıcı kısmına bir sorgu girmek son kullanıcının deneyimi için hem kolay değil hemde tercih edilecek bir yöntem değil. Dolayısı ile benim listelenen ürünlerin olduğu sayfada sayfalama linkleirmi göstermem daha faydalı olacak. Bunu yapabilmek için bir tag helper oluşturacağım.

Ama buna bir sonraki yazıda devam edeceğiz. Şimdilik bu kadar.

Bir cevap yazın

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