Próbuję dostać się do technologii mvc i czytam książkę 'pro asp.net mvc 3 framework' z apress. Utknąłem w jednym miejscu i teraz nie wiem, jak go rozwiązać, ponieważ jest to zupełnie inne niż zwykłe formularze internetowe. Oto komunikat o błędzie: Element modelu przekazany do słownika jest typu „System.Data.Entity.Infrastructure.DbQuery”1[SportsStore.Domain.Entities.Product]”, ale ten słownik wymaga modelu element typu „SportsStore.WebUI.Models.ProductsListViewModel”.

Nie wiem który dokładnie kod muszę wkleić ale oto co mam:

Widok:

@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>

Kontroler produktu:

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));
        }       
    }    
}

Daj mi znać, jeśli potrzebujesz więcej informacji. Dzięki, Łaziale

2
Laziale 27 sierpień 2012, 21:21

2 odpowiedzi

Najlepsza odpowiedź

Zmień to:

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

Do tego:

return View(viewModel);

Twoja strona oczekuje modelu typu SportsStore.WebUI.Models.ProductsListViewModel. Tworzyłeś instancję tego modelu widoku ze swojego repozytorium danych, ale nic z nim nie zrobiłeś po jego utworzeniu. MVC był zdezorientowany, ponieważ model, który wysłałeś do widoku, był inny niż oczekiwano. Po prostu zmieniam zwrot, aby użyć viewModel, który już utworzyłeś w wierszach przed zwrotem.

4
Gromer 27 sierpień 2012, 21:29

Model dla Twojego widoku to ProductListViewModel, na ten wiersz w Twoim widoku:

@model SportsStore.WebUI.Models.ProductsListViewModel

Jednak zwracasz inny typ niż kontroler, korzystając z tego wiersza tutaj:

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

Aby je dopasować, musisz zwrócić ProductListViewModel ze swojego kontrolera, więc być może będziesz musiał zrobić coś takiego:

ProductListViewModel vm = new ProductListViewModel(repository.Products.OrderBy(p => p.ProductID).Skip((page - 1) * PageSize).Take(PageSize));
return View(vm);
2
Brian S 27 sierpień 2012, 21:25