Merhaba arkadaşlar, Controller’dan View’e Birden Fazla Model Gönderme işleminden bahsedeceğim.
View kısmında verilerimizi göstermek için tek bir model ya da List<Model> şeklinde bir dönüş sağlarız. Bazı durumlarda ise ilgili sayfamıza birden fazla model göndermemiz gerekebilir. Örnek vermek gerekirse bir ürün modelimiz mevcut. Ürün detay sayfamızda bu ürünün modelini dönmemiz gerekiyor. Fakat bir de ürünün resimleri mevcut. Bu resimlerin bulunduğu modelimizi de dönmemiz gerekiyor. Böyle durumlarda birden fazla model döndürme işlemini nasıl sağlayabiliriz? gibi düşünceler aklımızda yer ediniyor. Bu konuda ise bize ViewModel yardımcı olacaktır. Bir adet ViewModel oluşturuyoruz. Ama bu model içinde UrunModel tipinde bir property ve List<UrunResim> tipinde 2 adet bir property tanımlama işlemi gerçekleştiriyoruz. Böylelikle artık bizim oluşturduğumuz ViewModel’imiz Urun Bilgilerini ve Urun Resim Bilgilerini tutmamızı ve sayfamıza(View) bu model şeklinde bir dönüş sağlamamızı sağlıyor.
Örnek üzerinden işlemlerimizi inceleyelim:
İlk olarak bir Urun ve UrunResim modellerimizi oluşturuyoruz.
public class Urun { public int UrunId { get; set; } public string UrunAdi { get; set; } public decimal UrunFiyati { get; set; } }
public class UrunResim { public int UrunResimId { get; set; } public int UrunId { get; set; } public string UrunResimAciklamasi { get; set; } public string UrunResimUrl { get; set; } }
Daha sonra UrunDetayViewModel’imizi oluşturuyoruz.
public class UrunDetayViewModel { public Urun Urun { get; set; } public List UrunResimleri { get; set; } }
ViewModelimizi oluşturduktan sonra ise Controller’da bulunan Action içeriğini yazalım.
public ActionResult Index() { UrunDetayViewModel model = new UrunDetayViewModel(); Urun urun = new Urun(); urun.UrunId = 1; urun.UrunAdi = "iPhone 7 Plus"; urun.UrunFiyati = 3500; List urunResimListesi = new List(); UrunResim urunResim = new UrunResim(); urunResim.UrunResimId = 1; urunResim.UrunId = 1; urunResim.UrunResimAciklamasi = "iPhone 7 Plus"; urunResim.UrunResimUrl = "Resim_1_URL"; // Aşağıda listeye iki şekilde de ekleme örneği yazdım. // İki şekilde de kullanım yapılabilir. urunResimListesi.Add(urunResim); urunResimListesi.Add(new UrunResim { UrunResimId = 2, UrunId = 1, UrunResimAciklamasi ="iPhone 7 Plus", UrunResimUrl = "Resim_2_URL" }); // Oluşturduğumuz modeldeki property'lere de atama işlemlerimizi gerçekleştiriyoruz. // Daha sonra da View'a UrunDetayViewModel'imizi gönderiyoruz. model.Urun = urun; model.UrunResimleri = urunResimListesi; return View(model); }
Action içeriğini yazdıktan sonra sıra geldi View’ımızı oluşturmaya. View’ı da aşağıdaki gibi oluşturduğumuzda ilgili bilgilerin geldiğini göreceğiz.
@model ModelBindingSample.Models.UrunDetayViewModel @{ ViewBag.Title = "Ürün Detay"; } <h2>Ürün Detay</h2> Ürün Adı: @Model.Urun.UrunAdi (@Model.Urun.UrunFiyati TL) @foreach (var resim in Model.UrunResimleri) { <img title="@resim.UrunResimAciklamasi" src="http://alicancevik.com/mvc-controllerdan-viewe-birden-fazla-model-gonderme/" alt="@resim.UrunResimUrl" /> }
Oluşturduğumuz sayfanın çıktısı aşağıdaki gibi olacaktır.
Gelir-gider takip projesi hazırlıyorum ana sayfada gelir ve gider tablosundan verileri viewmodel ile çektim aynı sayfa üzerinden veri ekleme yapmak istiyorum.
Gider Ekle
Gider Tutarı
Açıklama
ön taslakta bu kodları yazmıştım bunları html helper ile yaptığımda sadece tablonun ismi çıkıyor yardımcı olur musunuz nasıl bir yol izlemem gerekiyor
Merhaba ben bir sayfada hem veri göstermek hemde veri almak istiyorum bunun için bir çözüm bulamadım.WEB tarafında sayfamda hem for var hemde öğeler var bunun için modelı nasıl göndericem acaba
Merhaba, tam olarak nasıl bir şey yapmak istiyorsun? Hem Listeleme yapıp hem de bir post işlemi yapmak istiyorsun anladığım kadarıyla. Aslında formda bulunan input değerlerinin name özellikleri modelindeki isimlere uygun şekilde ayarlarsan controller tarafında da bu modeli karşılayarak değerleri alabilirsin. Listelediğin veriler üzerinden bir post işlemi yapıyorsan eğer durum biraz daha farklı olması gerekir. Detaylı bir şekilde yapmak istediğin işlemi anlatabilirsen daha fazla yardımcı olabilirim.
Veteriner için bir kayıt sistemi yapıyorum .Ana sayfada isim , soyisim , hayvan türü , sayısı , mesajı ,saat vs bunları alıcam ve kaydedicem.4 ayrı tablom var saat ,hayvan türü ,sayısı ve ana tablom veteriner servisi diğer üç tablom veteriner servisi tabloma foreign key ile bağlı o verileri dropdown ile seçtiriyorum .Daha önceden bazı yerlerde “tuple create ” yöntemini gördüm ama foreign keylerim tabloya kaydolmuyor yani sadece isim ve soyisim geliyor. ViewModel yönteminide denedim ama bir türlü yapamadım . anasayfa için oluşturduğum taplodan verileri göstericem.Yani kayıt ve ve listeleme tablolarım farklı.Birisinde post edicem diğerinde list ile listelicem.Bunlar web tarafında olucak admin paneline değil.
Merhaba, ilgili işlemi yapmak için kayıt formunu bir partial view ile yapabilirsin. Böylelikle anasayfada sadece listeleme ile ilgili işlem kalmış olur. Kayıt işlemi partial view içerisinde yapılabilir. Eğer illaki de ana sayfa üzerinde yapmak istiyorsan bir adet view model yapabilirsin. ViewModel içerisinde de kayıtlarını tutan bir property tanımı yapabilirsin. Kayıt işlemini gerçekleştirmek için de bir property oluşturup ilgili class’ları neyse onları verebilirsin. Ya da Bir class dosyan olur içerisinde 4 adet property olur ilgili işlemlerini sağlaması için. Daha sonra da Ana sayfada bu işlemin gerçekleştirilmesi için oluşturduğun input değerlerinin name bilgisini ilgili class’larındaki property isimleri ne ise o şekilde ayarlarsan kayıt işlemi sağlandığında bu kayıtlar gelecektir. Dropdownlar üzerinden eğer Id değerleri gelmiyorsa burada bir kontrol sağlaman gerekebilir yani oluşturduğun class içerisinde bu dropdownlar’ın name bilgisi ile class içerisindeki property ismi aynı olmalıdır. Html Helper’lar(DropdownFor,TextboxFor) ile bir kayıt işlemi gerçekleştiriyorsan zaten gelen model eşleştirmesini sağladığında bu değerlerin gelmesinde bir problem olmayacaktır. Örnek olması açısından oluşturduğun model ile otomatik bir Create Sayfası da oluşturursan ordan da verilerin gidip gitmediğine dair bir kontrol sağlayabilirsin. Debug ederek bu değerlerin gelip gelmediğini de teyit edersen aslında yapmak istediğin işlem bu şekilde gerçekleşecektir diye düşünüyorum. Ek olarak bu işlemleri yaparken aslında bir transaction ile yapman daha sağlıklı olacaktır. Çünkü herhangi bir yerde veri aktarımında problem olması durumunda ekleme işlemlerinin hiçbirisini yapmayacaktır.
Temeli anlatılmış, çok üstü kapalı bir yazı olmuş..
Çok faydalı bir paylaşım olmuş. Elinize sağlık.