2

私は mvc テクノロジに取り込もうとしており、apress から「pro asp.net mvc 3 フレームワーク」という本を読んでいます。これは通常の Web フォームとは大きく異なるため、1 か所で行き詰まりましたが、今はそれを解決する方法がわかりません。ここに私が得ているエラーがあります: The model item passed into the dictionary is of type 'System.Data.Entity.Infrastructure.DbQuery`1[SportsStore.Domain.Entities.Product]', but this dictionary requires a model item of type 「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);

あなたのページはタイプのモデルを期待していますSportsStore.WebUI.Models.ProductsListViewModel。このビューモデルのインスタンスをデータリポジトリから作成していましたが、作成後は何もしませんでした。ビューに送信したモデルが予想と異なっていたため、MVCは混乱していました。返品を変更して、返品viewModel前の行ですでに作成したものを使用します。

于 2012-08-27T17:23:50.893 に答える
2

ビューのモデルは、ビューのProductListViewModelこの行ごとに次のようになります。

@model SportsStore.WebUI.Models.ProductsListViewModel

ただし、次の行を介して、コントローラーから別のタイプを返します。

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 に答える