ASP NET CORE RAZOR PAGE BAKIM TEKNİK SERVİS PROJESİ DERS 008 CREATE POST HANDLER VE VALİDASYON

Bakım Tipi ekleyebilmek için ilgili bakım tipi oluşturma sayfasını eklemiştik. Get handler metodunu eklemiştik, şimdi gelelim post handler metodumuzu eklemeye.

Dersi video versiyonu üzerinden de takip etmenizi tavsiye ederim.

Kullanıcı (ilerleyen zamanda burası sadece admin için olacak) bakım tipi ekleme sayfasında bakım tipi adını ve fiyatını girip oluştur butonuna bastığında bakım tipinin database tarafındaki tablomuza eklenmesini sağlayalım. Create.cshtml.cs dosyamıza geliyorum ve kodlarımı yazıyorum.

Create.cshtml.cs içeriği:

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

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

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

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

        public IActionResult OnGet()
        {
            return Page();
        }

        public async Task< IActionResult > OnPostAsync()
        {
            if (!ModelState.IsValid)
            {
                return Page();
            }

            _db.BakimTipi.Add(BakimTipi);
            await _db.SaveChangesAsync();

            return RedirectToPage("Index");
        }
    }
}

Not: Kodları doğru takip edebilmek için video eğitimi izlemenizi öneririm.

Kod Açıklamaları:

Öncelikle veritabanı üzerinde işlem yapacağım için ApplicationDbContext classımdan yeni bir object türetiyorum. Akabinde constructor oluşturdum ve DI yöntemi ile lokal değişkenime atama işlemini yapıyorum.

Bunları yaptıktan sonra post işlemini gerçekleştiren metodumuzu yazacağım. Burada metodumuzun adını istediğiniz gibi verebilirsiniz yani illa içerisinde OnPost geçmesi gerekmiyor ben global isimlendirme yöntemi ile devam etmek istiyorum. Yani özellikle Get ve Post handler metotlarımda bu kural dışına bu proje için çıkmayacğaım. Ama spesifik özel metotlarda kuralı bozacağız tabii ki.

Post metodum içinde modelstate durumunu kontrol ediyorum, eğer modelstate durumu geçersiz ise sayfam geriye yüklenecek. Eğer geçerli ise yani sonuç false ise burada ! ile değil ise diyorum aslında, işlemim doğrudur ve bir veri geliyordur. Bu sefer if dışındaki işlemleri yapıyorum, yani bakım listesinin gösterildiği sayfaya dönüyorum. Burada neden valid cevabı alamayabiliriz, kullanıcı bakım tipi adını, bakım tipi fiyatı vs girmeyebilir mesela bu durumda uygun olmadığını anları, çünkü hatırlarsanız ki ben bir önceki derslere ilgili BakımTipi propertylerine Required attribute’ü tanımlamıştım. Buralar boş ise uygun olmadığı için kayıt olmaz.

BindProperty ile de ilgili propery’i Post metoduma bağlama işlemimi gerçekleştirdim.

Benim validasyon kontrolüm mevcut durumda client side validation yani sadece kullanıcı tarafında bir kontrol oluyor. Eğer kullanıcı javascript ayarlarını tarayıcısı üzerinden kapatırsa bu kontrol hiçbir işe yaramayacak ve veritabanıma yine boş veri gelebilecek. Bunun önüne geçebilmek için validasyon kontrolümün server side olması gerek. Bunu yapabilmek için, asp.net core bize bir güzellik sunuyor. Bununla ilgili olarak projemde Pages>Shared klasörü altında _ValidationsScriptPartial.cshtml dosyam var. Bu dosyamın referansını Create sayfama tanımlamam lazım.

Create son kısma geliyor ve kodlarımı yazıyorum:

Daha sonra Create içinde yine aşağıdaki şekilde düzenleme yapıyorum. Span asp-validation-for ekliyorum.

Create.cshtml içeriği:

@page
@model GursoyCNCBakim.Pages.BakimTipleri.CreateModel
@{
    ViewData["Title"] = "Create";
    Layout = "~/Pages/Shared/_Layout.cshtml";
}


Yeni Bakım Tipi Oluştur


@section Scripts{ @{ await Html.RenderPartialAsync("_ValidationScriptsPartial");} }

Görüleceği üzere şu anda sayfam çalışıyor ve boş bir alan bıraktığımda bana uyarı veriyor. Bunlar ingilizce ama gelin bunu değiştirelim. BakımTipi.cs modelime geliyorum ve Required attribute için ErrorMessage ekliyorum.

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

namespace GursoyCNCBakim.Models
{
    public class BakimTipi
    {
        public int Id { get; set; }

        [Required(ErrorMessage ="Bakım adının girilmesi gerekmektedir!")]
        public string BakimAdi { get; set; }

        [Required(ErrorMessage = "Bakım fiyatının girilmesi gerekmektedir!")]
        public double BakimFiyati { get; set; }
    }
}

İşlemleri en iyi şekilde görebilmek için video eğitimi izlemenizi tavsiye ederim. Bir sonraki derste görüşmek üzere.

Bir cevap yazın

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