2012-08-27 2 views
2

mvc 기술을 도입하려고하는데 'pro asp.net mvc 3 framework '. 나는 한 곳에서 달라 붙어서 지금은 어떻게 풀어야할지 모르겠다. 보통 웹 양식과 많이 다르니까. 여기에 오류가 있습니다 : 사전에 전달 된 모델 항목의 형식이 '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

viewmodel 대신보기로 엔티티 프레임 워크 오브젝트를 전달합니다. – 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입니다 :

return View(repository.Products.OrderBy(p => p.ProductID).Skip((page - 1) * PageSize).Take(PageSize)); 
: 여기에이 라인을 통해,

@model SportsStore.WebUI.Models.ProductsListViewModel 

그러나, 당신이 당신의 컨트롤러에서 다른 유형을 반환하는

일치하도록하려면 컨트롤러에서 ProductListViewModel을 반환해야하므로 다음과 같이해야 할 수 있습니다.

ProductListViewModel vm = new ProductListViewModel(repository.Products.OrderBy(p => p.ProductID).Skip((page - 1) * PageSize).Take(PageSize)); 
return View(vm); 
관련 문제