2012-08-27 993 views
2

的模型項目我正在嘗試進入mvc技術,並正在閱讀一本書'pro asp.net mvc 3 framework '從apress。 我被困在一個地方,我不知道如何解決它,因爲這是如此不同,然後普通的網頁形式。 這是我得到的錯誤:傳遞到字典中的模型項目類型爲'System.Data.Entity.Infrastructure.DbQuery`1 [SportsStore.Domain.Entities.Product]',但該字典需要模型項目類型'SportsStore.WebUI.Models.ProductsListViewModel'。傳入字典的模型項目類型爲'',但是此字典需要'''

我不知道到底是我需要貼上的代碼,但是這是我有:

查看:

@model SportsStore.WebUI.Models.ProductsListViewModel   
@{ 
    ViewBag.Title = "Products"; 
} 

<h2>List</h2> 

@foreach (var s in Model.Products) 
{ 
    <div class="item"> 
    <h3>@s.Name</h3> 
    @s.Description 
    <h4>@s.Price.ToString("c")</h4> 
    </div>  
} 

<div class="pager"> 
@Html.PageLinks(Model.PagingInfo, x => Url.Action("List", new { page = x })); 
</div> 

產品控制器:

namespace SportsStore.WebUI.Controllers 
{ 
    public class ProductController : Controller 
    { 
     public int PageSize = 4; 
     private IProductsRepository repository; 

     public ProductController(IProductsRepository productsRepository) 
     { 
      repository = productsRepository; 
     } 

     public ViewResult List(int page=1) 
     { 
      ProductsListViewModel viewModel = new ProductsListViewModel 
      { 
       Products = repository.Products 
       .OrderBy(p => p.ProductID) 
       .Skip((page - 1) * PageSize) 
       .Take(PageSize), 
       PagingInfo = new PagingInfo 
       { 
        CurrentPage = page, 
        ItemsPerPage = PageSize, 
        TotalItems = repository.Products.Count() 
       } 
      }; 
      return View(repository.Products.OrderBy(p => p.ProductID).Skip((page - 1) * PageSize).Take(PageSize)); 
     }  
    }  
} 

請讓我知道你是否需要更多信息。 謝謝,Laziale

+0

將實體框架對象傳遞給視圖而不是視圖模型。 – asawyer

+0

您的頁面從'SportsStore.WebUI.Models.ProductsListViewModel'繼承,但您傳遞給它一個'SportsStore.Domain.Entities.Product' –

回答

4

更改此:

return View(repository.Products.OrderBy(p => p.ProductID).Skip((page - 1) * PageSize).Take(PageSize)); 

這樣:

return View(viewModel); 

你的頁面期待SportsStore.WebUI.Models.ProductsListViewModel類型的模型。您正在從您的數據存儲庫創建此視圖模型的實例,但是一旦創建它就沒有做任何事情。 MVC越來越困惑,因爲你發送給視圖的模型與預期不同。我只是改變回報率,以便在迴歸前使用已在線中創建的viewModel

+1

您應該解釋其原因。 –

+1

即將編輯它,你們都是忍者! – Gromer

+2

感謝此解決方案。你們都是魔術師!我希望有一天能夠在MVC中達到這個水平:) – Laziale

2

您查看該模型是一個ProductListViewModel,按照該行的觀點:

@model SportsStore.WebUI.Models.ProductsListViewModel 

然而,你正在返回從你的控制器不同類型,通過這條線的位置:

return View(repository.Products.OrderBy(p => p.ProductID).Skip((page - 1) * PageSize).Take(PageSize)); 

爲了使它們匹配,您需要從控制器返回一個ProductListViewModel,因此您可能需要這樣做:

ProductListViewModel vm = new ProductListViewModel(repository.Products.OrderBy(p => p.ProductID).Skip((page - 1) * PageSize).Take(PageSize)); 
return View(vm); 
相關問題