このチュートリアルに従って、MVC4 プロジェクトの 1 つのビューで 2 つのモデルを返そうとしています。次のような Product という名前のモデルが 1 つあります。
public class Product : IEnumerable<ShoppingCartViewModel>,
IList<ShoppingCartViewModel>
{
public int ProductId { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
(...)
}
そして、次のような ShoppingCarts (List) のリストを持つ ViewModel:
public class ShoppingCartViewModel : IEnumerable<Product>, IList<Product>
{
public List<Cart> CartItems { get; set; }
public decimal CartTotal { get; set; }
}
次のことを行う「ラッパーモデル」が1つあります。
public class ProductAndCartWrapperModel
{
public Product product;
public ShoppingCartViewModel shoppingCart;
public ProductAndCartWrapperModel()
{
product = new Product();
shoppingCart = new ShoppingCartViewModel();
}
}
次に、このように2つの異なるモデルでビューを単純に表示しようとします
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<projectname.ProductAndCartWrapperModel>" %>
(...)
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<div>
<% foreach (projectname.Models.Product p in
ViewData.Model.product) { %>
<div>
<div id="ProductName"><%: p.Name %></div>
<div id="ProductPrice"><%: p.Price %></div>
</div>
<% } %>
</div>
<div>
<% foreach (projectname.ViewModels.ShoppingCartViewModel sc in
ViewData.Model.shoppingCart) { %>
<div>
<div id="Div1"><%: sc.CartItems %></div>
<div id="Div2"><%: sc.CartTotal %></div>
</div>
<% } %>
</div>
</asp:Content>
残念ながら、ビルドしようとするとエラーが 1 つ発生します
Cannot convert type 'projectname.Models.Product' to
'projectname.ViewModels.ShoppingCartViewModel'
両方のモデルで次のようなエラーのリストが続きます。
does not implement interface member
'System.Collections.Generic.IEnumerable<projectname.ViewModels.ShoppingCartViewModel>.
GetEn umerator()'. 'projectname.Models.Product.GetEnumerator()' cannot implement
'System.Collections.Generic.IEnumerable<projectname.ViewModels.ShoppingCartViewModel>.
GetEnumerator()' because it does not have the matching return type of
'System.Collections.Generic.IEnumerator<projectname.ViewModels.ShoppingCartViewModel>'.
両方のモデルを 1 つのページに表示するのにかなり近いと感じていますが、IEnumerator を実装して型を一致させる方法がわかりません。私はこのようなものを追加しようとしました:
public IEnumerator<Object> GetEnumerator()
{
return this.GetEnumerator();
}
しかし、それは無駄でした。
インターフェイスメンバーを正しく実装し、ソリューションを構築する方法を誰かが説明できれば、非常に感謝しています(可能であれば)。