MVC’de Edit Metodu
Bir önceki, MVC’de Create Metodu başlıklı yazımızda Create metodunu inceledik ve bu metod sayesinde ekleme işlemini gördük.Bu yazımızda ise, Edit metodu sayesinde düzenleme işlemini göreceğ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ı dizimizi kronolojik olarak takip ediyorsanız eğer, anımsayacaksınız ki, Ogrenci tipinden olan nesnelerimizi listelettikten sonra en son olarak Create metoduyla bu listeye ekleme işlemi yapmıştık.Şimdi aynı projeyi açıp, Controller katmanındaki “Ogrenci(Controller)” ismindeki sınıfımızda bulunan ActionResult tipindeki “Edit” metodumuzu bir inceleyelim.
//1.Metod public ActionResult Edit(int id) { return View(); } //2.Metod [HttpPost] public ActionResult Edit(int id, FormCollection collection) { try { return RedirectToAction("Index"); } catch { return View(); } }
Gördüğünüz gibi, Edit metodunun iki Overloadı mevcut.Önceki yazımızda da Create metodu bu şekilde iki overloaddan oluşuyordu.Aynı mantıkla, 1.Metod ismindeki Edit overloadı, Edit işleminin yapılacağı nesneyi yakalayıp, bu nesneyi View katmanına göndererek, 2.Metod ismindeki overload da , bu nesne üzerinde değişiklikler yapıldıktan sonra veritabanına işlemi işlemini üstlenecektir.
Zaten önceki yazımızda bahsettiğimiz gibi, [HttpPost] attribute işlemide, kullanıcı tarafından post işlemi geldiği zaman çalıştırılacak olan metodu göstermektedir.Sayfa ilk çağrıldığı anda 1.Metod ismini verdiğimiz Edit overloadı işleve girecektir, sayfadan Post tipinde bir talep gelince, 2.Metod ismindeki overload işleve girecektir.
Önceki yazılarımızda ,listemizi “View Content” şablonlarını kullanarak oluşturduğumuzdan dolayı, listemizde “Edit” linkinin mevcut olduğunu hatırlayacaksınız.
Öncelikle “Edit” linkinin tıklandığı öğrencimizin “ID” değerini yakalayıp, arkaplanda oluşturduğumuz Session da tutulan List koleksiyonumuzdan o Ogrenci nesnesini çekelim.
public ActionResult Edit(int id) { List Ogrencilerimiz = Session["Ogrenciler"] as List; Ogrenci DuzenlenecekOgrenci = Ogrencilerimiz.Where(o => o.ID == id).FirstOrDefault(); return View(DuzenlenecekOgrenci); }
Gördüğünüz gibi düzenlenmek istenen öğrencimizi çektik ve View katmanına gönderdik.Şimdi Edit Action’ına sağ tıklayarak, “Add View” seçeneğini seçip, View katmanındaki dosyasını oluşturalım.
Burada dikkat etmeniz gereken husus, “View Content” alanından “Edit” seçeneğini seçmeniz gerekmektedir.Oluşan Edit.aspx sayfasının kaynağı 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"> Edit </asp:Content> <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> <h2>Edit</h2> <% using (Html.BeginForm()) {%> <%: Html.ValidationSummary(true) %> <fieldset> <legend>Fields</legend> <div class="editor-label"> <%: Html.LabelFor(model => model.ID) %> </div> <div class="editor-field"> <%: Html.TextBoxFor(model => model.ID) %> <%: Html.ValidationMessageFor(model => model.ID) %> </div> <div class="editor-label"> <%: Html.LabelFor(model => model.Adi) %> </div> <div class="editor-field"> <%: Html.TextBoxFor(model => model.Adi) %> <%: Html.ValidationMessageFor(model => model.Adi) %> </div> <div class="editor-label"> <%: Html.LabelFor(model => model.SoyAdi) %> </div> <div class="editor-field"> <%: Html.TextBoxFor(model => model.SoyAdi) %> <%: Html.ValidationMessageFor(model => model.SoyAdi) %> </div> <div class="editor-label"> <%: Html.LabelFor(model => model.Yasi) %> </div> <div class="editor-field"> <%: Html.TextBoxFor(model => model.Yasi) %> <%: Html.ValidationMessageFor(model => model.Yasi) %> </div> <div class="editor-label"> <%: Html.LabelFor(model => model.Sinifi) %> </div> <div class="editor-field"> <%: Html.TextBoxFor(model => model.Sinifi) %> <%: Html.ValidationMessageFor(model => model.Sinifi) %> </div> <div class="editor-label"> <%: Html.LabelFor(model => model.SinifHocasi) %> </div> <div class="editor-field"> <%: Html.TextBoxFor(model => model.SinifHocasi) %> <%: Html.ValidationMessageFor(model => model.SinifHocasi) %> </div> <p> <input type="submit" value="Save" /> </p> </fieldset> <% } %> <div> <%: Html.ActionLink("Back to List", "Index") %> </div> </asp:Content>
Şimdi projemizi çalıştırıp, adres çubuğuna “http://localhost:****/Ogrenci” URL yapısında link girersek eğer, listemizi göreceğiz.Listemizden herhangi bir öğrenciye tıklarsanız, adres çubuğundaki linkin aşağıdaki şekilde olduğunu göreceğiz.
“http://localhost:****/Ogrenci/Edit/2”
Gördüğünüz gibi, kırmızı renkle gösterdiğim alanda, tıklanan öğrencinin “ID” değeri gelmektedir.Bunun sebebini, MVC’de Details,Create,Edit,Delete Metodları başlıklı yazımızı detaylı olarak incelerseniz anlayacaksınız.Kısaca, oluşturulan listenin, ActionLink metoduyla oluşturulan “Edit” linkinde, “id” isimli parametreye kullanıcımızın “ID” değerini vermemizdir.
Konuyu fazla dağıtmadan “ID” değerinden yakalayıp, View katmanına gönderdiğimiz öğrenci nesnesi üzerinde değişiklikler yapıp, değişiklikler yapılan bu nesneyi eski nesnemizle değiştirmeyi görelim.MVC’de düzenleme(Edit) işlemi bu mantıkla yapılmaktadır.
Tabi öncelikle, 2.Metod ismini verdiğimiz Edit overloadının parametrelerini inceleyelim.
int tipinden “id” adında ve FormCollection “collection” adında iki parametre almaktadır.
Şimdi şu mantığı iyi kavramamız gerekmektedir.Editlenecek öğrencinin “ID” değerinden ben 1.Metod ismini verdiğimiz overload da nesnesini oluşturuyorum ve değişiklikler için View katmanına gönderiyorum.Ee haliyle değişiklikler bu nesne üzerinde yapılacaktır ve ben bu nesneyi Post ettiğim zaman, 2.Metod ismini verdiğimiz Edit overloadı çalışıp, değişiklik yapılmış olan bu nesneyi yakalıyor ve eski nesneyle değiştiriyor.
O halde, int tipinden olan “id” adındaki parametremiz, o öğrencinin “ID” değerinde eski nesnemizi bize getirecektir.Yeni, güncellenmiş yani editlenmiş nesnemizide Ogrenci tipinden ikinci parametre almamız yeterli olacaktır.Burada FormCollection tipinden “collection” adında bir parametremiz varsayılan olarak yazılmıştır.Bu parametremizi biz Ogrenci tipine çevirirsek eğer, View katmanında yapılan post işlemi sırasında, bize güncellenmiş öğrencinin nesnesini gönderecektir.
[HttpPost] public ActionResult Edit(int id, Ogrenci GuncellenmisOgrenci) { try { List Ogrencilerimiz = Session["Ogrenciler"] as List; //Değiştirilecek eski ilk nesne Ogrenci DuzenlenecekOgrenci = Ogrencilerimiz.Where(o => o.ID == id).FirstOrDefault(); //Eski nesnemizi güncellenmişi ile değiştiriyoruz. UpdateModel(DuzenlenecekOgrenci,""); return RedirectToAction("Index"); } catch { return View(); } }
Yukarıdaki kodları incelerseniz eğer, 2. parametreyi Ogrenci tipinden “GuncellenmisOgrenci” adında bir parametre olarak değiştirdik.MVC’nin özelliğinde olan UpdateModel() metodu ile eski nesneyle yenisinin yerlerini değiştirdik.Bu metod, ilk parametresine değiştirilecek olan nesneyi, ikinci parametresine ise yerine koyulacak nesneyi almaktadır.Burada ikinci parametre yerine “” işareti koydum.Aslında bu parametreyi vermesekte olur.UpdateModel() fonksiyonu içine sadece değiştirilecek nesneyi yazmamız yeterli olacaktır.
Projemizi çalıştırıp, herhangi bir öğrenciyi Editlersek eğer, programımızın takırında olduğunu anlayacaksınız umarım 🙂
Bu yazımında sona gelmiş bulunmaktayız.Umarım MVC’de Update mekanizması hakkında azda olsa aklınızda bir temel oluşturabilmişimdir.
Faydalanmanız dileğiyle…
İyi çalışmalar…
Hocam Harikasınız fakat bu yazı dizilerini içindekiler şeklinde görebilsek daha faydalı olacak. Ne zaman sitenizde bir şey aramak istesem bulamıyor Googleda arattığımda çıkan sonuca girince kendimi yine sizin sitenizde tam da aradığım başlık altında buluyorum. Sonuç olarak süpersiniz ama emeklerinize ısrarla ulaşıp ders halinde yahut spesifik konular halinde okumak istediğimizde elimizin altında bir index olmadığı için sayfalar arasında kayboluyoruz. Muhtemelen sizi en az benim gibi ısrarla dinlemek isteyen okurların daha fazla istifade edememe sebebi budur diye düşünüyorum. Sevgi ve saygıyla
Merhaba Tekin,
Önerinizle ilgili Yazı Dizileri adı altında bir dizi oluşturma çabasına giriştim lakin bu biraz geç oldu ve genel konuları kapsayıcı şekilde cereyan etmedi. Yapılandırıcı öneriniz ve yaklaşımınız için çok teşekkür ederim. Bundan sonra bu konuyu daha çok göz önünde bulunduracak ve hatta geçmişte yazılan makaleler üzerinde dahi içerik klavuzu mahiyetinde bir liste yapmaya çalışacağım.
Sevgiler…