我正在尝试进入mvc技术,我正在从apress阅读一本书'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 :(得分: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 :(得分:2)
视图的模型是ProductListViewModel
,在您的视图中按此行:
@model SportsStore.WebUI.Models.ProductsListViewModel
但是,您将通过此行返回与Controller不同的类型:
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);