Önceki makalelerimizde MVC 3 ve Entity Framework kullanarak bir projeye başlamış, verilerimizi listelemiş ve yeni kayıt oluşturma işlemini incelemiştik. Projemizde Yazar tablomuzdaki kayıtları almıştık. Şimdi bu tabloya aynı yöntemle kayıt ekleme işlemini gerçekleştirelim.
Bir önceki makalemizdeki örneğimize kaldığımız yerden devam edeceğiz. Önceki makalemizden veri yapısını inceleyebilirsiniz.
Entity Framework ile Update işlemini gerçekleştirmemiş arkadaşlar, Entity Framework Insert makalesinden Entity Framework ile Update işlemini hatırlayabilirler.
Şimdi MVC 3 ile View’ımızdan verilerimizi alıp veritabanına kaydedelim.
Öncelikle MYazar modelimizde bir düzenleme yapmamız gerekecektir. Veritabanındaki türümüz Yazar, bizim View’lara gönderdiğimiz ve aldığımız veri türümüz MYazar’dır. Veritabanından gelen Yazar türündeki veriyi View’da MYazar türünden göstereceğimiz için MYazar sınıfımıza Yazar sınıfından verileri alacak bir method ekleyelim.
MYazar sınıfımızın son hali aşağıdaki gibidir.
MYazar.cs
- public class MYazar
- {
- public int YazarId { get; set; }
- public string YazarAd { get; set; }
- public int MakaleSayisi { get; set; }
- public Yazar ToYazar()
- {
- return new Yazar
- {
- YazarId = this.YazarId,
- YazarAd = this.YazarAd,
- MakaleSayisi = this.MakaleSayisi
- };
- }
- public void ImportFromYazar(Yazar yazar)
- {
- this.YazarId = yazar.YazarId;
- this.YazarAd = yazar.YazarAd;
- this.MakaleSayisi = yazar.MakaleSayisi;
- }
- }
Şimdi YazarController sınıfımıza gidip aşağıdaki methodu ekleyelim.
- public ActionResult Edit(int yazarId)
- {
- var duzenleYazar = (from y in _entity.Yazar where y.YazarId == yazarId select y).FirstOrDefault();
- var modelYazar = new MYazar();
- modelYazar.ImportFromYazar(duzenleYazar);
- return View(modelYazar);
- }
Burada, parametre olarak gelen yazarId’ye göre veritabanından o kaydın bilgisini alıp View’da gösterme işlemini gerçekleştireceğiz.
Methodumuzu oluşturduktan sonra Edit’e sağ tıklayıp Add View diyelim ve aşağıdaki seçimleri yapalım.
Add butonuna tıkladığımızda Edit View’ımız oluşacaktır ve kodu aşağıdaki gibi olacaktır.
- @model MVCMakale3.Models.MYazar
- @{
- ViewBag.Title = "Edit";
- Layout = "~/Views/Shared/_Layout.cshtml";
- }
- <h2>Edit</h2>
- <script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
- <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
- @using (Html.BeginForm()) {
- @Html.ValidationSummary(true)
- <fieldset>
- <legend>MYazar</legend>
- <div class="editor-label">
- @Html.LabelFor(model => model.YazarId)
- </div>
- <div class="editor-field">
- @Html.EditorFor(model => model.YazarId)
- @Html.ValidationMessageFor(model => model.YazarId)
- </div>
- <div class="editor-label">
- @Html.LabelFor(model => model.YazarAd)
- </div>
- <div class="editor-field">
- @Html.EditorFor(model => model.YazarAd)
- @Html.ValidationMessageFor(model => model.YazarAd)
- </div>
- <div class="editor-label">
- @Html.LabelFor(model => model.MakaleSayisi)
- </div>
- <div class="editor-field">
- @Html.EditorFor(model => model.MakaleSayisi)
- @Html.ValidationMessageFor(model => model.MakaleSayisi)
- </div>
- <p>
- <input type="submit" value="Save" />
- </p>
- </fieldset>
- }
- <div>
- @Html.ActionLink("Back to List", "Index")
- </div>
Burada, YazarId’ye bu ekranda ihtiyaç olmadığı için burada YazarId textbox’ının görünmesini istemiyoruz. Bu sebeple kodumuzu aşağıdaki gibi düzenleyelim (metinleri de Türkçeleştirelim J )
- @model MVCMakale3.Models.MYazar
- @{
- ViewBag.Title = "Yazar Düzenle";
- Layout = "~/Views/Shared/_Layout.cshtml";
- }
- <h2>Edit</h2>
- <script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
- <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
- @using (Html.BeginForm()) {
- @Html.ValidationSummary(true)
- <fieldset>
- <legend>MYazar</legend>
- <div class="editor-label">
- @Html.LabelFor(model => model.YazarId)
- </div>
- <div class="editor-label">
- @Html.LabelFor(model => model.YazarAd)
- </div>
- <div class="editor-field">
- @Html.EditorFor(model => model.YazarAd)
- @Html.ValidationMessageFor(model => model.YazarAd)
- </div>
- <div class="editor-label">
- @Html.LabelFor(model => model.MakaleSayisi)
- </div>
- <div class="editor-field">
- @Html.EditorFor(model => model.MakaleSayisi)
- @Html.ValidationMessageFor(model => model.MakaleSayisi)
- </div>
- <p>
- <input type="submit" value="Kaydet" />
- </p>
- </fieldset>
- }
- <div>
- @Html.ActionLink("Listeye Dön", "Index")
- </div>
Şimdi projemizi çalıştıralım.
Edit butonuna tıklayalım.
Yukarıdaki hatayla karşılaştık. Burada, Edit Action methodumuza Int32 türünde bir ID göndermemiz gerektiğini ve gönderme işlemini yapmadığımızı söylüyor. Bunu düzenlemek için Index.cshtml koduna gidip orada Edit linkini verdiğimiz yerde (@Html.ActionLink() methodu) düzenleme yapalım.
Linkimizin eski hali:
- @Html.ActionLink("Edit", "Edit") |
Linkimizin yeni hali:
- @Html.ActionLink("Edit", "Edit", new {yazarId = item.YazarId }) |
Şimdi projemizi çalıştıralım.
Edit butonunun üzerine faremizle geldiğimizde yönleneceği link olarak /Yazar/Edit/1 olarak belirlendiğini görüyoruz. Bu, Index.cshtml’de yaptığımız değişiklik sayesinde ID’yi alıp Edit() actionına yazarId=1 ile göndermeyi sağlamaktadır.
Şimdi Edit butonuna tıklayalım ve karşımıza nasıl bir ekran gelecek görelim.
Karşımıza düzenleme ekranımız geldi. Kaydet butonuna bastığımızda sayfamızın yapacağı işlemle ilgili herhangi bir düzenleme yapmadık. Şimdi bu düzenlemeyi yapmak için YazarController’a gidelim ve Edit() isminde aşağıdaki gibi, sayfamızdaki verilerimizi gönderdiğimizde (Post) çalışacak YENİ methodumuzu oluşturalım.
- [HttpPost]
- public ActionResult Edit(MYazar yazar)
- {
- var duzenleYazar = (from y in _entity.Yazar where y.YazarId == yazar.YazarId select y).FirstOrDefault();
- duzenleYazar.YazarAd = yazar.YazarAd;
- duzenleYazar.MakaleSayisi = yazar.MakaleSayisi;
- _entity.SaveChanges();
- return View();
- }
Şimdi projemizi yeniden çalıştırıp ekrandaki bilgileri düzenleyelim ve Kaydet butonuna tıklayalım.
Makale sayısını 136 yapalım.
Kaydet butonuna basalım. Post işlemi tamamlandıktan sonra Listeye Dön’e tıklayalım ve düzenleme işlemimizin başarıyla tamamlanıp tamamlanmadığını inceleyelim.
Göründüğü gibi verimiz güncellenmiştir. İstersek Kaydet butonuna tıkladığımızda return View() yerine return RedirectToAction(“Index”) diyerek kayıt işlemi tamamlanınca “Index” viewına geçmesini sağlayabiliriz.
Veysel Uğur KIZMAZ
Bilgisayar Mühendisi