none
MVC Bir View'de birden fazla Model Kullanımı RRS feed

  • Soru

  • Arkadaşlar merhaba , 

    MVC ile bir web sayfası hazırlıyorum ve şöyle bir hatayla karşılaşıyorum :

    The model item passed into the dictionary is of type 'System.Collections.Generic.List`1[Proje.Models.Yazilar]', but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable`1[Proje.Models.Deneyimler]'.

    Bu hata View'da 2. partialviewi ekledikten sonra çıktı. 2 partialview var ve bu hatada verdiği model classlarını kullanıyorlar.

    PartialView değil de Viewbag ile çalışırsam sorun olmuyor fakat Model kullanımı daha iyi bir tercih olduğunu düşünerekten ViewBag'den almak istemiyorum.

    Model tanımlaması da partialview'de de şu şekilde ;

    "  @model IEnumerable<Proje.Models.Yazilar>  "(2 model de IEnumerable )

    Deneyimler ve yazı bölümleri için 2 ayrı partialview .Sayfa tasarımı onepage olduğu içinde tek bir sayfa da bu iki partialı çağırıyorum Html.RenderPartial ile. ve bu hatayı veriyor. Yardımcı olursanız sevinirim arkadaşlar.


    • Düzenleyen ysmn_ist 21 Ağustos 2015 Cuma 13:50 ..
    20 Ağustos 2015 Perşembe 22:07

Yanıtlar

Tüm Yanıtlar

  • Modeli Deneyimler olan bir view'e Yazilar tipli bir instance gönderiyorsunuz.

    www.mvcblog.org
    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com

    • Yanıt Olarak Öneren Oğuz KURTCUOĞLU 21 Ağustos 2015 Cuma 07:49
    • Yanıt Önerisini Geri Alan ysmn_ist 21 Ağustos 2015 Cuma 08:37
    21 Ağustos 2015 Cuma 04:32
    Moderatör
  • Merhaba Önay Bey,

    Deneyimler partialviewinde de bu şekilde tanımlı; " @model List<Proje.Models.Deneyimler> "

    2 ayrı partialviewde de kendi modelleri tanımlı. HomeController'da da ikisinin modelini şöyle gönderiyorum  ;

    // Deneyimler
      public PartialViewResult ExperienceItems()
            {
                dbContext = new DB_Blog();
                var dataExp = dbCon.Deneyimler.ToList();
    
                return PartialView("ExperienceItems", dataExp);
    
            }
    
    //Yazılar
    
     public PartialViewResult BlogList()
            {
                dbContext = new DB_Blog();
                var data = dbCon.Yazilar.ToList();
           
                return PartialView("BlogPost",data);
    
            }



    • Düzenleyen ysmn_ist 21 Ağustos 2015 Cuma 08:30 ..
    21 Ağustos 2015 Cuma 08:29
  • yanlış bişeyler var, dbCon varken dbContext ler ne? Partial için Action lara da hiç gerek yok.

    Partial'lerimiz için veriyi ViewData ile taşıyın;



    www.mvcblog.org
    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com

    21 Ağustos 2015 Cuma 08:39
    Moderatör
  • Viewbag ya da View data kullanımından ziyade modellerle çalışmak istedim. Viewbag ile gerçekleştiriyor sıkıntı yok fakakt ben model ile çalışmak istiyorum.Viewbaglerle çalışmak kısa vadede bir çözüm gibi geliyor. Onepage bir tasarım olduğu için iki partialview de aynı sayfaya basıldığı için sayfaya 2 ayrı modelde basıyor haliyle sıkıntı böyle birşey olabilir mi ? O zaman partialviewin güzelliği nerde kalıyor ?  
    21 Ağustos 2015 Cuma 08:57
  • Model = Veri Gösterme şeklinde algılamayın. Model, post/get kısmında çok daha anlamlı. ViewBag değilde ViewData bu yapmak istediğiniz şey için oluşturulmuş bir collection. Size kolaymış gibi görünen şeyler, sanki yanlış yaptığınız hissine kapılmanıza neden oluyor sanırım. Ama MVC zaten işleri kolaylaştırmak amaçlı oluşturulan bişey.

    www.mvcblog.org
    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com

    21 Ağustos 2015 Cuma 10:02
    Moderatör
  • Peki Viewbag ile ViewData'nın syntax yapısından öte bir farkı yok sanırım .Yani performans açısından.

    Yıllardır Web.Formlarla çalışıyorum.MVC'ye geçince dediğiniz gibi işler daha kolay ve bu da ben de "Bu kadar kolaysa yanlış mı acaba" düşüncesi oluşturabiliyor. Ya da bunun yazılım tasarımı diyebileceğimiz anlamda daha güzel kullanımı vardır kesin diyorum . Viewbag ve Viewdata'da bu noktada benden veto yiyor. Viewbag-viewdatalarla çalışma alışkanlığı oluşmasını istemiyorum bu açıdan .Nasıl başlarsanız öyle gider mantığıyla. Bu sorunu viewbag ya da viewdata ile hallederim orası sıkıntı değil ama Model hatasını çözmem benim için daha değerli .Bu arada şöyle bir yöntemde denedim fakat yine aynı hatayı aldım ; Bir class oluşturup deneyimer ve yazılar modellerini bu yeni oluşturduğum model classına ekledim Sonra bu modeli 2 partialviewde de model olarak gosterdim yine aynı hatayı aldım.

     public class NModels
        {
    
            public IEnumerable <Yazilar> Yazilar { get; set; }
            public IEnumerable <Deneyimler> Deneyimler { get; set; }
        }

    //PartialViewDeneyim

    @model Blog.Models.NModels
    @foreach (var item in Model.Deneyimler)
    {
    //kodlar . . .    
    
    }

    21 Ağustos 2015 Cuma 11:34
  • ViewBag, ViewContext ve ViewData MVC nin bir parçasıdır, yok sayamazsınız ve kullanılması gereken yerde bunları kullanmalısınız. Yeni maceralara gerek yok bence.

    ViewBag dynamic tip için ViewData da object tip için düşünülmüştür.

    Partial'ınızı paylaşınca partial mantığını da yanlış anlamış olduğunuz ortaya çıkıyor. Partial'i bir user kontrol gibi düşünmelisiniz. Yani aynı anda birden fazla kullanacağınız bir view için partial kullanılır. Örneğin bir alışveriş sitesindeki ürün kutusunu partial yaparsınız bir sayfada birden fazla kutu gösterebilirsiniz, ayrıca diğer sayfalarda da kullanabilirsiniz. Partial'a Ürün tipli bir instance göndermeniz yeterli.

    @foreach(var item in ViewData["Deneyimler"] as IEnumerable<Deneyim>)
    {
        Html.Partial("DeneyimPartial", item);
    }
    
    bu kadar.



    www.mvcblog.org
    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com

    21 Ağustos 2015 Cuma 12:47
    Moderatör
  • Demek istediğinizi anladım Önay Bey ViewData ile o şekilde yapılabilir tamamdır. Yine de model hatasını çözmek istiyorum çünkü burada viewdata ile sorunu halletsem bu model olayını illa ki kullanacağım diye düşünüyorum. 

    PartialViewleri kaldırıp 2sini de HomeView'e atıyorum.

    Yani olay  şuna dönüyor (Bir view de birden fazla model kullanımı);

    (Hatta soru başlığını da değiştiriyorum olay başka bir yöne döndü :) )

    //HomeView

    @model Proje.Models.NModels

    @foreach (var item in Model.DeneyimlerList) { //Kodlar} @foreach (var item in Model.YazılarList) { //Kodlar}

    //NMODELS
      public class NModels
        {
    
            public IEnumerable <Yazilar> YazilarList { get; set; }
            public IEnumerable <Deneyimler> DeneyimlerList { get; set; }
        }

    Burada da yine şöyle bir hata verdi :

    The model item passed into the dictionary is of type 'System.Collections.Generic.List`1[Proje.Models.Yazilar]', but this dictionary requires a model item of type 'Proje.Models.NModels'.

    21 Ağustos 2015 Cuma 13:49
  • Deleted
    • Yanıt Olarak İşaretleyen ysmn_ist 21 Ağustos 2015 Cuma 15:02
    21 Ağustos 2015 Cuma 14:50
  • Teşekkürler Onur ben de birkaç dk. önce sorunu çözdüm .

    Tuple kullanmadan Actionresult'da NModels da ki Modellere datalarını gönderdim.Senin yazdığının Tuple'siz hali diyelim :)

    Ben yine de senin yanıtını çözüm olarak işaretleyip konuyu kapatıyorum. İlginiz için teşekkürler arkadaşlar :)

    21 Ağustos 2015 Cuma 15:02
  • Onur Akgün senınle bu konu hakkında görüşmek istiyorum. mailini verebılır mısın?

    7 Eylül 2019 Cumartesi 22:56
  • Teşekkürler Onur ben de birkaç dk. önce sorunu çözdüm .

    Tuple kullanmadan Actionresult'da NModels da ki Modellere datalarını gönderdim.Senin yazdığının Tuple'siz hali diyelim :)

    Ben yine de senin yanıtını çözüm olarak işaretleyip konuyu kapatıyorum. İlginiz için teşekkürler arkadaşlar :)

    Bu sorunun tuple kullanmadan nasıl çözüldüğü ile ilgili bilgisi olan varmı bende aynı sorunu yaşıyorum
    7 Aralık 2019 Cumartesi 15:07
  • Zaten bu durum için MVC'de, Html.Action(ChildView) ve ViewBag var. İnsanlar kafalarının dikine gittikleri için Tuple gibi gereği olmayan şeyler kullanıyorlar.

    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com

    7 Aralık 2019 Cumartesi 15:15
    Moderatör