Asp.Net Mvc 4 Veri Listeleme Problemi
-
Selam arkadaşlar,
İş yerimdeki bir projeden dolayı Asp.Net Mvc öğreniyorum. Web Forms' ta baya tecrübeliyim fakat Mvc' de çok basit bir konuda takıldım. Hemen sorunuma geçeyim.
Veri tabanıım hazır. Orm olarak Entity Framework kullanıyorum. Sayfamda istediğim veriyi listelemek istiyorum fakat hata alıyorum.
HomeControllerim var Index Metodum aşağıdaki şekilde.
var Article = (from x in Context.Articles orderby x.ArticleId descending where x.IsActive == true select new { x.Title, x.Date, x.ArticleId, x.Picture }).Take(9); return View(Article);Index View' im aşağıdaki şekilde.
@model IEnumerable<MvcLinq.Models.Article> @{ ViewBag.Title = "Index"; } <ol> @foreach (var item in Model) { <li> @item.Title </li> } </ol>Sayfamı çalıştırdığımda aşağıdaki hatayı alıyorum.
The model item passed into the dictionary is of type 'System.Collections.Generic.List`1[System.String]', but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable`1[emreblog_mvc.Models.Article]'.
Controller içerisindeki sorgumu aşağıdaki gibi değiştirirsem hata ortadan kalkıyor.
var Article = (from x in Context.Articles orderby x.ArticleId descending where x.IsActive == true select x).Take(9);
Article tablosundaki tüm kolonları çekersem problem olmuyor ama sadece bana lazım olan kolonları çekmeye çalışırsam hata alıyorum.
Yardımınızı bekliyorum Mvc ile ilgili sormak 2 farklı soru daha var.
Teşekkür ederim.
Diathorus tarafından 05/Tem/15 11:18 tarihinde düzenlenmiştir -
selam,
ilk sorgunda dönen tipin generic olması soruna sebep oluyor gördüğüm kadarıyla
var Article = (from x in Context.Articles orderby x.ArticleId descending where x.IsActive == true select new Article { x.Title, x.Date, x.ArticleId, x.Picture }).Take(9); return View(Article);yaparsan çalışması gerekiyor
unbalanced tarafından 05/Tem/15 11:36 tarihinde düzenlenmiştir -
select new { x.Title, x.Date, x.ArticleId, x.Picture }"Select" yaptığın zaman buradan sana geriye senin ienumerable "Article" nesnen dönmez, orada belirttiğin kolonları içeren yeni bir nesne yaratılıp dönderilir, bu durumda da belirttiğin casting hatasını alırsın.
Şöyle dene;
var article = Context .Articles .Where(x => x.Active) .OrderByDescending(x => x.ArticleId) .Take(9); return View(article);
-
trampfd bunu yazdı
select new { x.Title, x.Date, x.ArticleId, x.Picture }"Select" yaptığın zaman buradan sana geriye senin ienumerable "Article" nesnen dönmez, orada belirttiğin kolonları içeren yeni bir nesne yaratılıp dönderilir, bu durumda da belirttiğin casting hatasını alırsın.
Şöyle dene;
var article = Context .Articles .Where(x => x.Active) .OrderByDescending(x => x.ArticleId) .Take(9); return View(article);
Selam dostum,
Senin dediğin gibi yaptığım zaman problem ortadan kalkıyor mesajımda da bahsetmiştim zaten. Bu söz diziliminin sql çıktısı
" Select Top(9)* From Article Where IsActive = 1 Order By ArticleId DESC " şeklinde oluyor.
Fakat bana sadece 4 kolon lazım diğerleri lazım değil.
Bu şekilde yapmak için yeni Article model oluşturmam lazım 4 kolonluk.
İyi de bu saçma değil mi ben her durum için sürekli yeni model mi oluşturcam yada sürekli Select * From mu demek zorunda kalcam?
Diathorus tarafından 05/Tem/15 12:00 tarihinde düzenlenmiştir -
unbalanced bunu yazdı
selam,
ilk sorgunda dönen tipin generic olması soruna sebep oluyor gördüğüm kadarıyla
var Article = (from x in Context.Articles orderby x.ArticleId descending where x.IsActive == true select new Article { x.Title, x.Date, x.ArticleId, x.Picture }).Take(9); return View(Article);yaparsan çalışması gerekiyor
Selam,
Olmadı şu şekilde hata alıyorum.
Error 1 Cannot initialize type 'emreblog_mvc.Models.Article' with a collection initializer because it does not implement 'System.Collections.IEnumerable' D:\Projeler\emreblog-mvc\emreblog-mvc\Controllers\homeController.cs 20 47 emreblog_mvc
-
dışardayım şuan, çözemezsen aksam bakalım teamviewerdan. class article ise hem classı hem değişken ismini aynı şekil yazman sorun olabilir.
-
Diathorus bunu yazdıtrampfd bunu yazdı
select new { x.Title, x.Date, x.ArticleId, x.Picture }"Select" yaptığın zaman buradan sana geriye senin ienumerable "Article" nesnen dönmez, orada belirttiğin kolonları içeren yeni bir nesne yaratılıp dönderilir, bu durumda da belirttiğin casting hatasını alırsın.
Şöyle dene;
var article = Context .Articles .Where(x => x.Active) .OrderByDescending(x => x.ArticleId) .Take(9); return View(article);
Selam dostum,
Senin dediğin gibi yaptığım zaman problem ortadan kalkıyor mesajımda da bahsetmiştim zaten. Bu söz diziliminin sql çıktısı
" Select Top(9)* From Article Where IsActive = 1 Order By ArticleId DESC " şeklinde oluyor.
Fakat bana sadece 4 kolon lazım diğerleri lazım değil.
Bu şekilde yapmak için yeni Article model oluşturmam lazım 4 kolonluk.
İyi de bu saçma değil mi ben her durum için sürekli yeni model mi oluşturcam yada sürekli Select * From mu demek zorunda kalcam?
Tamam o zaman arkadaşın dediği şekilde yaparsın ama orada syntax hatası var, "Article" nesnenin propertylerine karşılık gelecek şekilde atama yapman lazım, şu şekilde dene;
select new Article { Title = x.Title, Date = x.Date, ArticleId = x.ArticleId, Picture = x.Picture }).Take(9); -
hocam viewe datayı anonymous tipinde gönderiyorsun, new { x.Title, x.Date, x.ArticleId, x.Picture } bu kısımda artık çektiğin data Articles modelinde dönmüyor. Belirsiz tip yaratıyorsun ve view de article tipinde data gelecek diyorsun.
iki yolu var bu işin;
1. bir view modeli oluşturursunclass YeniViewModelin{
pulic sctring Title{get;set;}
pulic DateTime Date {get;set;}
pulic int ArticleId {get;set;}
pulic sctring Picture {get;set;}
}
linq;new YeniViewModelin{ Title = x.Title, Date = x.Date, ArticleId = x.ArticleId, Picture = x.Picture }
view;
@model IEnumerable<MvcLinq.Models.YeniViewModelin>
2. yöntem iste expando object olarak gönderirsin, bi tür dynamic aslında.
yazmaya üşendim şu link işini görür: http://stackoverflow.com/questions/5120317/dynamic-anonymous-type-in-razor-causes-runtimebinderexception -
sen tipsiz bişey verirsen adama nasıl map'licek propertyleri :D
http://stackoverflow.com/a/10465897
şurda dynamic proxy i nasıl maplersin anlatmış tek method yetiyor zaten.
https://github.com/AutoMapper/AutoMapper
Not: dur ben basit bişey yapmıştım maplemek için bi deniyim çalışırsa onu atıyım
SinusX tarafından 05/Tem/15 15:33 tarihinde düzenlenmiştir -
Arkadaşlar sağolun paylaştığınız bilgiler için çok faydalı oldu. 2. sorumu birazdan paylaşacağım :D
Problemi şimdilik Anonymous veri tipinden vazgeçerek çözdüm. View' in beklediği Article şeklinde datayı gönderdim.
