Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

MVC’de Delete Metodu

Bir önceki, MVC’de Edit Metodu başlıklı yazımızda MVC’de Edit metodunu irdeleyip, düzenleme işlemi nasıl yapıldığını incelemiştik.Bu yazımızda ise, ActionResult tipinden olan Delete metodunu inceleyip, silme işleminden bahsedeceğiz.

Dikkat !!!
Bu yazımızı anlamanız için bir önceki yazımızı detaylı bir biçimde okumanız gerekmektedir.Yazı dizisi oluşturduğumdan dolayı, bir yazı önceki ve sonrakiyle bağlantılı şekilde örneklendirilmiştir.

Yazı dizimizde kullandığımız üzerinde çalıştığımız projeyi açıp,Controller katmanında olan “Ogrenci(Controller)” sınıfımızda ki ActionResult tipinden olan “Delete” metoduna bir göz atalım.

//1.Metod
        public ActionResult Delete(int id)
        {
            return View();
        }
//2.Metod
        [HttpPost]
        public ActionResult Delete(int id, FormCollection collection)
        {
            try
            {
                return RedirectToAction("Index");
            }
            catch
            {
                return View();
            }
        }

Create ve Edit metodlarında ki mantığın aynısı Delete metodunda da geçerlidir.Öncelikle silinecek nesneyi 1.Metod ismini verdiğimiz Delete overloadıyla oluşturup View katmanına gönderiyoruz.Yapılan Post işlemi sonucu 2.Metod ismini verdiğimiz Delete overloadı ile View katmanına gönderilen o nesneyi sileceğiz.

Öncelikle 1.Metod ismini verdiğimiz overloadımızı oluşturalım.

        public ActionResult Delete(int id)
        {
            List<Ogrenci> Ogrenciler = Session["Ogrenciler"] as List<Ogrenci>;
            Ogrenci SilinecekOgrenci = Ogrenciler.Where(o => o.ID == id).FirstOrDefault();
            return View(SilinecekOgrenci);
        }

Yukarıda gördüğünüz gibi, int tipinden “id” değerine eşit olan öğrencimizi seçip, View katmanına gönderiyoruz.Şimdi “Ogrenci(Controller)” sınıfındaki Delete metoduna sağ tıklayarak “Add View” diyelim ve View katmanındaki dosyasını oluşturalım.

Burada dikkat etmeniz gereken husus, “View content” alanından “Delete” seçeneğini seçip Add butonuna basmanızdır.
Delete.aspx sayfasının kaynak kodları aşağıdaki gibidir.

      <%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<Calisma.Models.Ogrenci>" %>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
	Delete
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <h2>Delete</h2>
    <h3>Are you sure you want to delete this?</h3>
    <fieldset>
        <legend>Fields</legend>
        <div class="display-label">ID</div>
        <div class="display-field"><%: Model.ID %></div>
        <div class="display-label">Adi</div>
        <div class="display-field"><%: Model.Adi %></div>
        <div class="display-label">SoyAdi</div>
        <div class="display-field"><%: Model.SoyAdi %></div>
        <div class="display-label">Yasi</div>
        <div class="display-field"><%: Model.Yasi %></div>
        <div class="display-label">Sinifi</div>
        <div class="display-field"><%: Model.Sinifi %></div>
        <div class="display-label">SinifHocasi</div>
        <div class="display-field"><%: Model.SinifHocasi %></div>
    </fieldset>
    <% using (Html.BeginForm()) { %>
        <p>
		    <input type="submit" value="Delete" /> |
		    <%: Html.ActionLink("Back to List", "Index") %>
        </p>
    <% } %>
</asp:Content>

Şimdi Delete.aspx sayfamızı oluşturmuş olduk.Projemizi çalıştırıp tarayıcıya “http://localhost:****/Ogrenci” benzer URL girelim.Listemizden herhangi bir öğrencinin “Delete” linkine tıklayalım.
Aşağıdaki gibi bir ekran göreceksiniz.

Şimdi buraya kadar olan mantığı bir analiz edelim.Listemizden herhangi bir öğrenciye tıkladığımız zaman, “http://localhost:****/Ogrenci/Delete/2” gibisinden bir URL oluşturmaktadır.(2. ID ye sahip öğrenciye tıkladığımı varsayalım.)Bu URL yapısının Delete metodumuzla arasındaki muhakemesini yaparsak, buradaki “2” değerini “Ogrenci(Controller)” ismindeki Controller’ımız içindeki, ActionResult tipinden olan Delete metodunun “id” parametresine gönderiyor ve yukarıda yaptığımız işlemler sonucunda “ID” değeri “2” değerine eşit olan öğrenci getirtiliyor ve View katmanına gönderiliyor.

Bu hususta Delete sayfamız(yani View’ımız) açıldığına göre, demek ki gelen öğrenci nesnemizi buradaki “Delete” butonuna bastığımız zaman silmesi gerekiyor.Bu butona basıldığı zaman kullanıcı tarafından bir Post işlemi gerçekleştirileceğinden dolayı, [HttpPost] attributeını taşıyan Delete metodumuz çalıştırılacak ve bu nesnemizi veritabanından sildireceğiz.

Şimdi bu işlemleri yapalım.

//2.Metod
        [HttpPost]
        public ActionResult Delete(int id, Ogrenci SilinecekOgrenci)
        {
            try
            {
                List<Ogrenci> Ogrenciler = Session["Ogrenciler"] as List<Ogrenci>;
                Ogrenciler.Remove(SilinecekOgrenci);
                return RedirectToAction("Index");
            }
            catch
            {
                return View();
            }
        }

Öncelikle Post işlemi sonucunda silinecek olan bir tane Ogrenci nesnesi olacaktır.O yüzden 2.Metod isimli overloadımızın FormCollection tipinden olan “collection” ismindeki parametresini Ogrenci tipine çeviriyor ve bu gelen bir öğrenciyi bu parametreyle yakalıyorum.Daha sonra da bu metod içinde gerekli işlemlerimi yapıyorum.

Bu şekilde projemizi çalıştırıp, herhangi bir öğrencinin Delete linkine tıklayarak, gelen ekranda Delete butonuna tıklıyorum.Eğer bu işlemi sizlerde yaparsanız görürsünüz ki, listemizden tıkladığımız öğrenci silinmemiştir.
Eğer, Delete overloadlarının ikisinide Break Point koyup takip edersek, Ogrenci tipinden olan “SilinecekOgrenci” adındaki parametremize gelen nesnemize bir tek “ID” değerinin geldiğini, diğer propertylerinin “null” değerde olduğunu görürüz.

Bu parametrenin yakaladığı nesnenin, “ID” değerinin doğru gelmesinin sebebi, Delete butonuna basmadan önce, tarayıcımızın adres çubuğunda “http://localhost:****/Ogrenci/Delete/1” yapısındaki URL’mizdeki parametre değeridir.
“Ogrenci(Controller)” adındaki Controller sınıfımız içinde bulunan, ActionResult tipinden olan “Delete” metoduna bu parametreyi gönderdiğinden dolayı, bu nesnenin “ID” değeri doğru olarak gelmektedir.

Ancak diğer alanlar neden “null” ya da “0” değerinde gelmektedirler?Bu sorunun cevabına, Delete.aspx kaynak kodlarının bir bölümünü inceleyerek verebiliriz.

...
    <% using (Html.BeginForm()) { %>
        <p>
		    <input type="submit" value="Delete" /> |
		    <%: Html.ActionLink("Back to List", "Index") %>
        </p>
    <% } %>
...

Yukarıdaki kodları incelerseniz eğer, Delete.aspx sayfasının kaynak kodlarından bir parçasıdır.Burada ki “Html.BeginForm()” metodu oluşacak .html sayfasının kaynağındaki <form action.. tagını oluşturmaktadır.Ee haliyle, “Html.BeginForm()” metodunun scopeları içinde kalan elemanlar Post işlemine tabii tutuluyor.Dolayısıyla, bu metod scopeları dışında kalan elemanlar Post işlemiyle gönderilmemektedirler.Bu yüzden de, o bilgiler yerine “null” yazılmaktadır.

Bu sebepten dolayı, nesnemizi silerken, sadece int tipinden olan “id” parametremizi kullanacağız.Ogrenci tipinden olan “SilinecekOgrenci” parametresini silebiliriz.Ancak şuna dikkat etmeliyiz ki, “Ogrenci(Controller)” ismindeki Controller sınıfında “Delete” metodunun overloadı, aynı tipte parametreler barındırmış olacağından dolayı derleyici hata verecektir.

Bu yüzden, 2.Metod ismindeki metodumuzdaki parametrenin tipini string tipine çeviriyorum.(Parametre adı değişmeyecek.)

        [HttpPost]
        public ActionResult Delete(string id)
        {
            try
            {
                List&lt;Ogrenci&gt; Ogrenciler = Session[&quot;Ogrenciler&quot;] as List&lt;Ogrenci&gt;;
                Ogrenci SilinecekOgrenci = Ogrenciler.Where(o =&gt; o.ID == int.Parse(id)).FirstOrDefault();
                Ogrenciler.Remove(SilinecekOgrenci);
                return RedirectToAction(&quot;Index&quot;);
            }
            catch
            {
                return View();
            }
        }

Gördüğünüz gibi, gelen “id” değerine eş olan öğrencimizin nesnesini oluşturduk ve listemizden bu nesneyi sildirdik.Projemizi çalıştırıp Delete işlemini denediğimiz zaman, listemizden öğrencinin gittiğini göreceksiniz.

Bu yazımızda da, MVC’de Delete metodu ile silme işlemini incelemiş olduk.Bir sonraki yazımızda görüşmek üzere..
Faydalanmanız dileğiyle..
İyi çalışmalar..

Bunlar da hoşunuza gidebilir...

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir