Ben 4 katmanlı test amaçlı bir proje oluşturdum , 1- entity framework class ( adventureworks kullandım) 2- business class ( adventure works ' de örnek amaçlı product listesi getirmek için kullandım) 3- surrogate class ( bunu şu amaçla kullandım , product ' da 30 ' a yakın property var ben hepsini kullanmak istemediğimden dolayı sadece 2 alan kullanmak için bu classı yaptım içinede bir productsurrogate class koydum ) 4-hepsini kullananda wcf mimari üzerinden mvc projesine veri aktaran bir servis yaptım) ( Wcf ayarlamasınıda yaptım geriye List döndürecek şekilde) şimdi ben wcf üzerinden getproductlist döndüyorm List<productsurrogate> getList - buda tabiki business'daki method. ve dönen servisdeki veriyi productconttroller' da çekip view' a veriyorum.( return View(_result.ToList()); ) Asıl sorun şurda View'dan geriye döndürdüğüm değeri List< productsurrogate> değerini view' da kullanmaya çalıştığımda The model item passed into the dictionary is of type 'System.Collections.Generic.List`1[MVC_TestProject.ProductService.ProductSurrogate]', but this dictionary requires a model item of type 'System.Collections.Generic.List`1[Surrogate.ProductSurrogate] Hatası alıyorum Bunun sebebinide biliyorum aslında Geriye dönen tipi List olarak görmüyor , bir int yada string değer olarak görüyor , benim bildiğim kadarıylada çözümüde MVC tarafında kullanabileceğim bir model yapıp onu kullanmak ama zaten benim bir modelim var artı bir model neden kullanıyorumki ? ------------------------------- Surrogate DLL public class ProductSurrogate { public int ProductId { get; set; } public string Name { get; set; } } -------------------------------- Business DLL public class ProductionOperation { public List<ProductSurrogate> Get_ProductList() { List<ProductSurrogate> _productSurrogate = new List<ProductSurrogate>(); using (AdventureWorksEntities context = new AdventureWorksEntities()) { _productSurrogate = (from p in context.Products select new ProductSurrogate { Name = p.Name, ProductId = p.ProductID }).ToList(); } return _productSurrogate; } } ------------------------------------------- WCF Service public class ProductService : IProductService { static ProductionOperation operations = new ProductionOperation(); public List<Surrogate.ProductSurrogate> Get_ProductList() { return operations.Get_ProductList(); } } ------------------------------------------- mvc ' deki controller [HttpGet] public ActionResult Index() { ProductService.ProductServiceClient client = new ProductService.ProductServiceClient(); List<ProductService.ProductSurrogate> _result = client.Get_ProductList(); return View(_result.ToList()); } -------------------------------------------------- View tarafı @model List<Surrogate.ProductSurrogate> @{ ViewBag.Title = "Index"; } <h2>Index</h2> <table> <tr> <th></th> <th> Name </th> </tr> @foreach (var item in Model) { <tr> <td> @item.Name </td> </tr> } </table> -------------------------------------------------
Sorun çözüldü arkadaşlar;
Sorun tip uyuşmazlığı, elinizde olan bir modeli view için başka modele cevirip atmanıza gerek yok.
Controller içerisindeki modelinizin tipi List<ProductService.ProductSurrogate> Fakat view içerisindeki modelinizin tipi List<Surrogate.ProductSurrogate> ikisinden birini değiştimeniz gerekiyor -ki bu view içerisinde olan.
View sayfaları için özel oluşturulan modellere ViewModel denir. ViewModeller ise zorunlu değildir. Client-side-validation işlemlerini kolaylaştımak ve temiz kod yazmak için yararlıdır.