ASP NET CORE RAZOR PAGE BAKIM TEKNİK SERVİS PROJESİ DERS 010 BAKIM TİPİ EDIT SAYFASI GET VE POST HANDLER METOTLARININ OLUŞTURULMASI

Bu dersimizde kullanıcı düzenleme butonuna bastığında ne olacak bunları gerçekleştirelim. Öncelikle Pages>BakimTipleri klasörüne sağ tıklıyor ve yeni bir Razor Page ekliyorum.

Bu dersin video versiyonunu da izlemenizi tavsiye ederim.

Bu sefer Razor Page ekleme işleminde boş bir razor page değil, ikinci seçenek olaran Razor Page using Entity Framework seçiyorum. Böylelikle bunu seçtiğimizde neler oluyor bir görelim.

Bu seçeneği seçince benim dialog box’ım değişiyor.

Razor Page name alanına vermek istediğimiz ismi yazıyoruz, ismimiz Edit olacak.

Template alanında Edit seçiyoruz. Burada Create, Delete, Details, List gibi seçeneklerde mevcut ancak ben şu an düzenleme işlemi yapacağım için template olarak Edit seçiyorum.

Model class alanında, ilgili model classımızı seçiyoruz projemizde yer alan BakimTipi yani.

DataContextClass kısmında da ApplicationDbContext seçiyoruz, projemizde bu şekilde.

Bu sayfam partial view olmayacak, dolayısı ile Create as a partial View seçeneği tikini kaldırıyoruz.

Reference Script Libraries tikli kalacak. _Layout’u kullanacağım için Use a layout page tikli kalacak ve referans adresi de tanımlanmış olacak.

Add dedikten sonra Edit sayfamız otomatik olarak oluşturuluyor. Burada görüleceği üzere Edit.cshtml.cs içinde kodlarımız eklenmiş.

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

namespace GursoyCNCBakim.Pages.BakimTipleri
{
    public class EditModel : PageModel
    {
        private readonly GursoyCNCBakim.Data.ApplicationDbContext _context;

        public EditModel(GursoyCNCBakim.Data.ApplicationDbContext context)
        {
            _context = context;
        }

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

        public async Task< IActionResult > OnGetAsync(int? id)
        {
            if (id == null)
            {
                return NotFound();
            }

            BakimTipi = await _context.BakimTipi.FirstOrDefaultAsync(m => m.Id == id);

            if (BakimTipi == null)
            {
                return NotFound();
            }
            return Page();
        }

        // To protect from overposting attacks, enable the specific properties you want to bind to, for
        // more details, see https://aka.ms/RazorPagesCRUD.
        public async Task< IActionResult > OnPostAsync()
        {
            if (!ModelState.IsValid)
            {
                return Page();
            }

            _context.Attach(BakimTipi).State = EntityState.Modified;

            try
            {
                await _context.SaveChangesAsync();
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!BakimTipiExists(BakimTipi.Id))
                {
                    return NotFound();
                }
                else
                {
                    throw;
                }
            }

            return RedirectToPage("./Index");
        }

        private bool BakimTipiExists(int id)
        {
            return _context.BakimTipi.Any(e => e.Id == id);
        }
    }
}

Şimdi kodlarımızı incelemeden önce bi çalıştırıp görelim.

Bir değişiklik yapıyorum ve değişikliğin kaydedildiğini update işlemi yapıldığını görüyorum. Aslında benim daha kod yazmama gerek yok bu aşamada 😊

Kodlarımızı uyarlama

Ancak tabi ben kendime uyarlamak istiyorum kodlarımı, dolayısı ile Edit.cshtml.cs dosyama geliyor ve kodlarımı düzenliyorum.

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

namespace GursoyCNCBakim.Pages.BakimTipleri
{
    public class EditModel : PageModel
    {
        private readonly ApplicationDbContext _db;

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

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

        public async Task< IActionResult > OnGetAsync(int? id)
        {
            if (id == null)
            {
                return NotFound();
            }

            BakimTipi = await _db.BakimTipi.FirstOrDefaultAsync(m => m.Id == id);

            if (BakimTipi == null)
            {
                return NotFound();
            }
            return Page();
        }

        // To protect from overposting attacks, enable the specific properties you want to bind to, for
        // more details, see https://aka.ms/RazorPagesCRUD.
        public async Task< IActionResult > OnPostAsync()
        {
            if (!ModelState.IsValid)
            {
                return Page();
            }

            var BakimFromDb = await _db.BakimTipi.FirstOrDefaultAsync(a => a.Id == BakimTipi.Id);
           
            BakimFromDb.BakimAdi = BakimTipi.BakimAdi;
            BakimFromDb.BakimFiyati = BakimTipi.BakimFiyati;

            await _db.SaveChangesAsync();

            

            return RedirectToPage("./Index");
        }

        
    }
}

Sayfamızı görelim:

Bu iki kod farkında en önemli husus şu aslında; ilk kod bloğunda yer alan;

_context.Attach(BakimTipi).State = EntityState.Modified;

İle ben veritabanımda yer alan bu tabloya ilişkin tüm alanların güncellenmesini sağlarım. Ancak ben her zaman tüm alanları güncellemek istemeyebilirim. Sadece bir alan veya birkaç alan güncellemek isteyebilirim. Dolayısı ile kullanıcıya sadece güncellenecek alanları gösteren bir form sunabilirim. Bu durumda kullanıcıdan sadece birkaç alan bilgisi alınacağı için üstteki kod hata verecektir. Çünkü diğer alanlara ilişkin veri alamayacaktır. Belki disable edip kullanıcıya form üzerinde sunup tekrar geri çekerim, birkaç alana sahip bir tablo için bu kolay ancak diyelim ki 100 alanlı bir formum var ve ben sadece 5 alanda güncelleme istiyorum, her seferinde 95 tane alanın verisini aynı şekilde olsa bile tekrar mı kaydedeceğim. İşte bu etkin bir çözüm değil, dolayısı ile burada bu yapıyı kullanmayıp, güncellemek istediğim alanları tanımlayabilecek şekilde kodlarımı düzenledim. Video da daha detaylı görebilirsiniz.

Bir sonraki derste görüşmek üzere.

Bir cevap yazın

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