Web işlemleri iki ana unsur üzerine çalışır. POST ve GET işlemleri. Bu yazımda daha çok post işlemi üzerinde duracağım. Asp.net MVC’de post işlemini servera tarafına bilgi post edip işlem yapmak istediğimiz zaman kullanırız. Eğer ki kullanıcı bir bilgiyi view’dan controller’a bir şekilde iletecekse burada bir post işlemi söz konusudur. Hemen bir örnek üzerinden devam edelim.
* İlk olarak aşağıdaki gibi Personel adında bir model class’ı oluşturalım.
public class Personel { public int Id { get; set; } [DisplayName("Adi")] public string Ad { get; set; } [DisplayName("Soyad")] public string Soyad { get; set; } [DisplayName("Tc Kimlik No")] public string TcKimlikNo { get; set; } [DisplayName("Dogum Tarihi")] public DateTime DogumTarih { get; set; } }
* Model class’ını oluşturduktan sonra. HomeContollerimizin içerisine statik verilerimizi ve personel actionResult metodumuzu oluşturalım.
private static List<Personel> _personel = new List<Personel> { new Personel{Id=1,Ad="cagatay",Soyad="kızıltan",TcKimlikNo="11111111111",DogumTarih= new DateTime(1993,09,01)}, new Personel{Id=2,Ad="Huseyin",Soyad="kızıltan",TcKimlikNo="1111111112",DogumTarih= new DateTime(1993,09,01)}, new Personel{Id=3,Ad="Yesim",Soyad="kızıltan",TcKimlikNo="1111111113",DogumTarih=new DateTime(1993,09,01) }, }; public ActionResult Personeller() { return View(_personel); }
* Statik verilerimizi ve ActionResult Personeller() metodumuzu oluşturduktan sonra bu metoda tempate’i List model şablonu Personel olan bir view ekleyelim. Anlayacağınız üzere bu actionResult Personeller() metodunun amacı sadece bizim statik verierimizi ekranda listelemek ve butona tıkladığımızda post işlemini gerçekleştirmektir.
@model IEnumerable<websiteblog.Models.Personel> @{ ViewBag.Title = "Personeller"; } <h2>Personeller</h2> <p> @Html.ActionLink("Create New", "Create") </p> <table class="table"> <tr> <th> @Html.DisplayNameFor(model => model.Ad) </th> <th> @Html.DisplayNameFor(model => model.Soyad) </th> <th> @Html.DisplayNameFor(model => model.TcKimlikNo) </th> <th> @Html.DisplayNameFor(model => model.DogumTarih) </th> <th></th> </tr> @foreach (var item in Model) { <tr> <td> @Html.DisplayFor(modelItem => item.Ad) </td> <td> @Html.DisplayFor(modelItem => item.Soyad) </td> <td> @Html.DisplayFor(modelItem => item.TcKimlikNo) </td> <td> @Html.DisplayFor(modelItem => item.DogumTarih) </td> <td> <input type="submit" value="Sil" /> </td> </tr> } </table>
* Oluşan View yukarıdaki şekilde olacaktır. Şimdi HomeController sınıfımıza geri dönüp , işin önemli kısmı olan HttpPost metodumuzu aşağıdaki gibi yazalım.
[HttpPost] public RedirectToRouteResult Sil(int id) { var silinecekPersonel = _personel.Where(p => p.Id == id).FirstOrDefault(); _personel.Remove(silinecekPersonel); return new RedirectToRouteResult(new RouteValueDictionary(new {action="Personeller",controller="Home" })); }
Bu metot ne işe yarıyor ? Birazdan view sayfasına post eklentilerini ekleyeceğiz ama eklemeden önce şuan yukarıdaki metodun ne işe yaradığını kısaca bir anlatayım. View’ımızdan post ettiğimiz veri bu metodun parametresi tarafından tutulacak ki bu da personel kaydının ID’si olacak. Yani bu metot sadece bir sayı alıcak herhangi bir personel nesnesi değil. Daha sonra aldığı IDyi listenin içerisindeki personellerin Idleriyle bir bir kıyaslayacak.
var silinecekPersonel = _personel.Where(p => p.Id == id).FirstOrDefault(); Personel listeme ait p adında gezici bir nesne oluştur ve bu nesne üzerinden tüm personellerimiz ID’lerini gez.Ne zaman ki Idsi benim parametre olarak aldığım idye eşit bir personel yakalarsın onu değişkene ata anlamında bir kod.
_personel.Remove(silinecekPersonel); Daha sonra personeli listeden sil.
* View’ımıza geri dönelim ve bizi post metoda yönlendirecek kodlarımızı aşağıdaki gibi yazalım.
@foreach (var item in Model) { using (Html.BeginForm("Sil","Home",new {id=item.Id},FormMethod.Post)) { <tr> <td> @Html.DisplayFor(modelItem => item.Ad) </td> <td> @Html.DisplayFor(modelItem => item.Soyad) </td> <td> @Html.DisplayFor(modelItem => item.TcKimlikNo) </td> <td> @Html.DisplayFor(modelItem => item.DogumTarih) </td> <td> <input type="submit" value="Sil" /> </td> </tr> } }
using (Html.BeginForm(“Sil”,”Home”,new {id=item.Id},FormMethod.Post)) bu kod satırını daha ayrıntılı inceleyelim. 4 adet parametresi var. İlki yönlenilecek olan post metodu, ikincisi controllerin ismi , üçüncüsü ve en önemlisi post metoda yollanacak parametre, dördüncüsü ise post işlemi gerçekleşeceğini belirtiyor.
üçüncü parametrenin üzerinde biraz daha duralım. Yukarıda view kodlarında gördüğünüz gibi her bir model foreach döngüsüyle item değişkenine atılıyor ve dolayısıyla her bir itemin Id,Ad,Soyad,TcKimlikno ve DogumTarihi var. 3. parametrede new {id = item.Id} diyerek id adında yeni bir değişken yarattıgımızı , item’in idsini buna atadığımızı ve bunu post metoda yollayacağımızı söylüyoruz. Burda Id yerine Ad,Soyad,Tckimlikno vs üzerinden de gidebilirdik ancak Id kadar sağlıklı olmazdı. Bir diğer önemli nokta , gönderdiğiniz argumanın name’i post metodundaki parametrenin name’iyle birebir aynı olmak zorunda örnekte de bu id = id dir.
Bunu birkaç örnekle çoğaltmak istersek ;
using (Html.BeginForm("Sil","Home",new {isim=item.Ad},FormMethod.Post)) [HttpPost] public RedirectToRouteResult Sil(string isim) using (Html.BeginForm("Sil","Home",new {Tc=item.TcKimlikNo},FormMethod.Post)) [HttpPost] public RedirectToRouteResult Sil(string Tc) using (Html.BeginForm("Sil","Home",new {isim=item.Ad,soyisim = item.Soyad},FormMethod.Post)) [HttpPost] public RedirectToRouteResult Sil(string isim,string soyisim )
yazabiliriz.
2.PARAMETRE OLARAK BUTON ISMI GONDERME
Bazı durumlarda parametre olarak butonun ismini yani hangi butona bastığınızı da metoda post etmeniz gerekebilir bu genelde çok butonlu formlarda çalışırken karşımıza çıkar. Örneğin, hesapmakinesi kodluyorsak inputlarımız aynı yani 2 tane sayi ancak bastığımız butonlar farklı ve her biri ayrı bir işleme götürecek şekilde olmalıdır (toplama,çıkarma,çarpma vs butonu).
* Aşağıdaki kodda farklı olarak submit butonumuza bir de name = “buton1” özelliği verdik. Şuan submit butonunun bir value değeri bir de name değeri var siz bunu değişken tanımladığımız gibi int sayi=5; gibi name = value; şeklinde düşünebilirsiniz.
@foreach (var item in Model) { using (Html.BeginForm("Sil","Home",new {id=item.Id},FormMethod.Post)) { <tr> <td> @Html.DisplayFor(modelItem => item.Ad) </td> <td> @Html.DisplayFor(modelItem => item.Soyad) </td> <td> @Html.DisplayFor(modelItem => item.TcKimlikNo) </td> <td> @Html.DisplayFor(modelItem => item.DogumTarih) </td> <td> <input type="submit" value="Sil" name="buton1" /> </td> </tr> }
* Aşağıda da httpPost metodumuzu tekrar düzenleyelim.
[HttpPost] public RedirectToRouteResult Sil(int id,string buton1) { var silinecekPersonel = _personel.Where(p => p.Id == id).FirstOrDefault(); _personel.Remove(silinecekPersonel); return new RedirectToRouteResult(new RouteValueDictionary(new {action="Personeller",controller="Home" })); }
işlem bu kadar artık siz submit işlemini yaptığınızda buton1 parametresine buton1’in value’si olan sil değeri gelecektir. Siz de bu mantığı kullanarak tek bir form içinde tek bir HttpPost metodu kullana bir hesap makinesi yapabilirsiniz . Basılan butonun değerini basit if else koşul yapısıyla sorgulayan ve ona göre işlem yapan bir hesap makinesi yazarken bu işlem gayet konforlu gelecektir.