ASP.NET Core Kitap Listeleme Projesi Ders 09

Güncelleme İşleminin Gerçekleştirilmesi

Bu dersimizde kullanıcı Güncelle butonuna basıldığında güncelleme işleminin yapılmasını sağlayacağız. Duzenle sayfamızda formumuzun metodu post ve güncelle butonu da submit olarak belirtilmiş. Buradan Duzenle sayfamızın code behind tarafına geçelim ve kodlarımızı yazalım:

Detaya sahip olmak için video dersini de izlemenizi tavsiye ederim.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using KitapListesiProjesi.Models;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;

namespace KitapListesiProjesi.Pages.KitapListesi
{
    public class DuzenleModel : PageModel
    {
        private KLDbContext _db;

        public DuzenleModel(KLDbContext db)
        {
            _db = db;
        }

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

        public async Task OnGet(int id)
        {
            Kitap = await _db.Kitap.FindAsync(id);
        }

        public async Task< IActionResult > OnPost()
        {
            'if'(ModelState.IsValid)
            {
                var DBGelenKitap = await _db.Kitap.FindAsync(Kitap.Id);
                DBGelenKitap.KitapAd = Kitap.KitapAd;
                DBGelenKitap.Yazar = Kitap.Yazar;
                DBGelenKitap.ISBN = Kitap.ISBN;

                await _db.SaveChangesAsync();

                return RedirectToPage("Index");
            }

            return RedirectToPage();
        }
       
    }


}

Not: if önünde ve arkasında tırnak işareti kod içinde yok, wp hatasını geçebilmek için burada kullandım. Videoda detayı görebilirsiniz.

OnPost metodumu asenkronik task tipinde tanımladım. Geriye bir sayfa döndürmesi sebebi ile IACtionResult olması gerekiyor.

Öncelikle ModelState uygunluk durumunu kontrol ediyorum. Eğer true değeri elde edersem; Kitap bilgilerini artık databaseden çekip kullanabilirim. Böylelikle update yani güncelleme işlemimi gerçekleştirebilirim. KitapAd, Yazar ve ISBN bilgilerini güncelleme işlemim için bir değişken oluşturdum buraya ilgili kitabın mevcut verilerini çektim. Daha sonra kullanıcının açmış olduğu yeni sayfada inputlara girmiş olduğu verileri, yeni oluşturduğum nesne içindeki propertylere atama işlemi yaptım. Database tarafında değişiklikliklerin yansıması için SaveChangesAsync kullandım. Tüm işlemler bitince kullanıcının index sayfasına yönlenmesini sağladım.

Eğer modelstate valid değil ise yani false geri dönüş sağlandı ise sayfamın yeniden yüklenmesini sağlıyorum.

Uygulamayı çalıştıralım. Uygulama çalışıp güncelleme yapmak istediğimiz da bir hata alacağız. Bu hatada bir verinin null değere sahip olduğundan bahsediyor. (Videoda ilgili hatalı kısmı görebilirsiniz)

Bu hatayı aşabilmek için Duzenle sayfama geliyorum. Benim burada KitapAd, Yazar ve ISBN propertylerim tanımlı ancak ID yok, dolayısı ile ID için bir property yazmam lazım. Bu noktada hidden field kullanmamız gerek. Çünkü ID değerine kullanıcı müdahale etsin zaten istemiyoruz. Duzenle sayfama geliyorum ve ilgili ID için input type ekleme işlemi yapıyorum.

@page
@model KitapListesiProjesi.Pages.KitapListesi.DuzenleModel


Kitap Bilgileri Düzenle


@section Scripts { }

Tekrar test edelim.

Videoda güncelleme işlemini görebilirsiniz.

İşlem tamam.

Yani buradan şunu anlıyoruz eğer benim güncelleme işleminde kullanılmayacak bir yani üzerinde güncellenmesini istemediğim bir property var ise, bunu her halükarda input type olarak düzenleme sayfamda tanımlamalı ve Hidden olarak ayarlamalıyım.

Silme İşleminin Gerçekleştirilmesi

Şimdide veri silme işlemi yapalım. Silme işlemini de kitap oluşturma ve kitap güncelleme gibi aynı şekilde yapabiliriz. Yeni bir Silme sayfası ekleriz. Burada yer alan Sil butonuna basılınca post eventini gerçekleştirecek kodlarımızı yazarız. Ancak ben burada biraz daha yeni şeyler yapacağım.

Benim yapmak istediğim kullanıcı eğer Sil butonuna tıklar ise ben bir pop-up menü çıkaracağım. İlgili verinin silinmek istenildiğinden emin misiniz şeklinde sorumu yönelteceğim. Eğer kullanıcı tamam der ise direkt olarak index sayfasında kitabın listelenmemesini sağlayacağım.

Öncelikle Index sayfama geliyorum. Kodlarımı düzenliyorum.

@page
@model KitapListesiProjesi.Pages.KitapListesi.IndexModel



Kitap Listesi

@'if' (Model.Kitaplar.Count()>0) { < table class="table table-striped border"> < tr class="table-secondary"> < th > < /th > < th > @*@Html.DisplayNameFor(a => a.Kitaplar.FirstOrDefault().Yazar)*@ < /th > < th > < /th > < th >İŞLEMLER< /th > < /tr > @foreach(var item in Model.Kitaplar) { < tr > < td > @Html.DisplayFor(a => item.KitapAd) < /td > < td > @Html.DisplayFor(a => item.Yazar) < /td > < td > @Html.DisplayFor(a => item.ISBN) < /td > < td > Düzenle < /td > < /tr > } < /table > } else {

Listelenecek kitap bulunamadı...

}

if önünde ve arkasında tırnak işareti kod içinde yok, wp hatasını geçebilmek için burada kullandım. Videoda detayı görebilirsiniz.

Kullanıcıya burada pop-up ile silmek istediğinizden emin misiniz şeklinde sordum. Eğer true şeklinde bir cevap alır isem bu sefer silme işlemi için ilgili page handler’i döndürmem gerek. Dikkat ederseniz bu sefer asp tag helper kullanmadım. Asp-page-handler kullandım.

Şimdi çalıştıralım ama silme işlemi yapmayalım. Videoda görebilirsiniz.

Buraya kadar sorun yok. Peki silme işlemini henüz yapamayız, dolayısı ile yazmam gerekenlere geri dönelim. Index.cshtml.cs dosyama geliyorum ve kodlarımı yazıyorum.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using KitapListesiProjesi.Models;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.EntityFrameworkCore;

namespace KitapListesiProjesi.Pages.KitapListesi
{
    public class IndexModel : PageModel
    {
        private readonly KLDbContext _db;

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

        public IEnumerable< Kitap > Kitaplar { get; set; }

        public async Task OnGet()
        {
            Kitaplar = await _db.Kitap.ToListAsync();
        }

        public async Task< IActionResult > OnPostSil(int id)
        {
            var kitap = await _db.Kitap.FindAsync(id);

            if(kitap == null)
            {
                return NotFound();
            }
            _db.Kitap.Remove(kitap);
            await _db.SaveChangesAsync();

            return RedirectToPage("Index");
        }
    }
}

Burada silme işlemi için handler metodumu yazdım. Public asenkronik task tipinde IactionResult tanımlamasını yaptım. Çünkü burada bir güncelleme olacak, yani silme olacak aslında yeniden bu sayfam yüklenecek.

Kodlarımda yine öncelikle silinecek kitap propertyleri yeni bir değişkene (kitap) atadım.

If bloğu ile kitap için ID gelmedi ise bulunamadı şeklinde mesaj verdirdim.

Eğer bulundu ise bu sefer ilgili ID değerine sahip kitabı listeden kaldırdım. Değişikliklerin database tarafına yansıması içinde SavaChangesAsync metodumu kullandım. Akabinde Index sayfasına yönlendirme yaptım.

Şimdi test edip sonucu görelim. İşlem tamam (Videoda görebilirsiniz)

Şu ana kadar yaptıklarımız ile bu minik uygulamamız üzerinde temel CRUD yani create, upate, delete ve list işlemlerini gerçekleştirdik. Artık bir nebze daha büyük projelere geçebiliriz. Ama bu KitapListesi projesi için birkaç video daha çekip temel bilgilere devam etmek istiyorum. Bir sonraki video da görüşmek üzere..

Bir cevap yazın

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