1

このチュートリアルに従って、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();
    }

しかし、それは無駄でした。

インターフェイスメンバーを正しく実装し、ソリューションを構築する方法を誰かが説明できれば、非常に感謝しています(可能であれば)。

4

1 に答える 1

1

Productがから継承されている場合IEnumerable<ShoppingCartViewModel>、繰り返し処理すると要素Productが得られることを意味します。ShoppingCartViewModel

<% foreach (Product p in ViewData.Model.product) { %>

する必要があります:

<% foreach (ShoppingCartViewModel p in ViewData.Model.product) { %>

しかし、ここでのあなたのデザインは非常に奇妙です。おそらくやりすぎですか?

于 2013-10-30T16:37:36.610 に答える