2

我正在尝试进入 mvc 技术,并且正在阅读 apress 的“pro asp.net mvc 3 framework”一书。我卡在一个地方,我现在不知道如何解决它,因为这与普通的 Web 表单有很大不同。这是我得到的错误:传递到字典中的模型项的类型是“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));
        }       
    }    
}

如果您需要更多信息,请告诉我。谢谢,拉齐尔

4

2 回答 2

4

改变这个:

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

对此:

return View(viewModel);

您的页面需要一个 type 的模型SportsStore.WebUI.Models.ProductsListViewModel。您正在从数据存储库中创建此视图模型的实例,但在创建后没有对其进行任何操作。MVC 感到困惑,因为您发送到视图的模型与预期的不同。我只是将退货更改为使用viewModel您在退货之前已经在行中创建的。

于 2012-08-27T17:23:50.893 回答
2

您的视图模型是 a 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);
于 2012-08-27T17:25:00.343 回答