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 odpowiedzi
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.
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);
Podobne pytania
Nowe pytania
c#
C # (wymawiane „patrz ostro”) jest językiem programowania wysokiego poziomu, statycznie typowanym, wieloparadygmatowym opracowanym przez firmę Microsoft. Kod C # zwykle jest przeznaczony dla rodziny narzędzi Microsoft .NET i czasów wykonywania, do których należą między innymi .NET Framework, .NET Core i Xamarin. Użyj tego tagu w przypadku pytań dotyczących kodu napisanego w C # lub C # formalnej specyfikacji.