C# 如何使用ViewModel在MVC4应用程序中实现IEnumerator

C# 如何使用ViewModel在MVC4应用程序中实现IEnumerator,c#,asp.net-mvc-4,mvvm,ienumerator,C#,Asp.net Mvc 4,Mvvm,Ienumerator,我试图在MVC4项目的一个视图中返回两个模型,方法如下。我有一个名为Product的模型,看起来像这样: public class Product : IEnumerable<ShoppingCartViewModel>, IList<ShoppingCartViewModel> { public int ProductId { get; set; } public strin

我试图在MVC4项目的一个视图中返回两个模型,方法如下。我有一个名为Product的模型,看起来像这样:

public class Product : IEnumerable<ShoppingCartViewModel>, 
                           IList<ShoppingCartViewModel>
    {
        public int ProductId { get; set; }
        public string Name { get; set; }
        public decimal Price { get; set; }
        (...)
    }
public class ShoppingCartViewModel : IEnumerable<Product>, IList<Product>
    {
        public List<Cart> CartItems { get; set; }
        public decimal CartTotal { get; set; }
    }
public IEnumerator<Object> GetEnumerator()
    {
        return this.GetEnumerator();
    }
然后,我尝试以这种方式简单地显示两个不同模型的视图

<%@ 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>
然后是两种型号的错误列表,如下所示:

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>'.
不实现接口成员
'System.Collections.Generic.IEnumerable。
GetEn umerator()projectname.Models.Product.GetEnumerator()无法实现
'System.Collections.Generic.IEnumerable。
GetEnumerator(),因为它没有匹配的返回类型
'System.Collections.Generic.IEnumerator'。
我觉得我很接近在一个页面上显示这两个模型,但我不知道如何实现IEnumerator并使类型匹配。我试着加上这样一个:

public class Product : IEnumerable<ShoppingCartViewModel>, 
                           IList<ShoppingCartViewModel>
    {
        public int ProductId { get; set; }
        public string Name { get; set; }
        public decimal Price { get; set; }
        (...)
    }
public class ShoppingCartViewModel : IEnumerable<Product>, IList<Product>
    {
        public List<Cart> CartItems { get; set; }
        public decimal CartTotal { get; set; }
    }
public IEnumerator<Object> GetEnumerator()
    {
        return this.GetEnumerator();
    }
public IEnumerator GetEnumerator()
{
返回此.GetEnumerator();
}
但那是徒劳的


如果有人能解释如何正确实现接口成员并获得构建的解决方案(如果可能的话),我将不胜感激

产品
继承自
IEnumerable
时,这意味着迭代
产品
将给出
ShoppingCartViewModel
元素

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

应该是:

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


但是你的设计很奇怪,也许你做得太过火了?

产品
继承自
IEnumerable
时,这意味着迭代
产品
将得到
ShoppingCartViewModel
元素

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

应该是:

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


但是你的设计很奇怪,也许你做得太过分了?

为什么
产品
实现了
IEnumerable
?如果需要枚举视图中的某个对象,只需将视图模型设置为具有(要枚举的对象的)IEnumerable。你的视图模型看起来太复杂了。我这么做是因为教程也在这么做。但好吧,我只能列举出产品?我如何在viewmodel中实现这个IEnumerable?为什么
产品
实现了一个
IEnumerable
?如果需要枚举视图中的某个对象,只需将视图模型设置为具有(要枚举的对象的)IEnumerable。你的视图模型看起来太复杂了。我这么做是因为教程也在这么做。但好吧,我只能列举出产品?我如何在我的viewmodel中使这个IEnumerable?哇!结合bump的注释(删除IList实现)这样做可以消除大量错误。我现在遇到的4个错误与此类似:错误4的projectname.Models.Product“未实现接口成员”System.Collections.Generic.IEnumerable.GetEnumerator()'您知道如何解决此问题吗?这是因为您必须定义从
IEnumerable
继承时如何进行枚举。如果您不需要为
GetEnumerator
实现特定行为,您可以使用
List
而不是
IEnumerable
好的,删除IEnumerable确实会生成解决方案,但是当我转到这两个模型的页面时,我得到了以下错误:CS1579:foreach语句不能对“projectname.models.Product”类型的变量进行操作,因为“projectname.models.Product”不包含“GetEnumerator”的公共定义。所以我想我需要定义一个,我不知道怎么做。您仍然需要一个
GetEnumerator
的实现来使用
foreach
,这就是为什么我告诉您使用
List
而不是
IEnumerable
,因为它适合您的需要:
公共类产品:List
。删除这两个选项将不允许您对集合进行迭代。谢谢您是个天才。解决方案正在生成,页面显示时没有错误。不幸的是,信息尚未显示,但必须能够解决。谢谢!哇!结合bump的注释(删除IList实现)这样做可以消除大量错误。我现在遇到的4个错误与此类似:错误4的projectname.Models.Product“未实现接口成员”System.Collections.Generic.IEnumerable.GetEnumerator()'您知道如何解决此问题吗?这是因为您必须定义从
IEnumerable
继承时如何进行枚举。如果您不需要为
GetEnumerator
实现特定行为,您可以使用
List
而不是
IEnumerable
好的,删除IEnumerable确实会生成解决方案,但是当我转到这两个模型的页面时,我得到了以下错误:CS1579:foreach语句不能对“projectname.models.Product”类型的变量进行操作,因为“projectname.models.Product”不包含“GetEnumerator”的公共定义。所以我想我需要定义一个,我不知道怎么做。您仍然需要一个
GetEnumerator
的实现来使用
foreach
,这就是为什么我告诉您使用
List
而不是
IEnumerable
,因为它适合您的需要:
公共类产品:List
。删除这两个选项将不允许您对集合进行迭代。谢谢您是个天才。解决方案正在生成,页面显示时没有错误。不幸的是,信息尚未显示,但必须能够解决。谢谢!