【问题标题】:How to make a Viewmodel of type IEnumerable?如何制作 IEnumerable 类型的 Viewmodel?
【发布时间】:2011-08-24 19:27:51
【问题描述】:

我将以下代码用于包含两个数据列表的主视图模型,

namespace trsDatabase.Models
{
    public class masterViewModel
    {
        public IEnumerable <Customer> Customers { get; set; }
        public IEnumerable <CustomerSite> CustomerSites { get; set; }
    }
}

我正在使用以下代码将 veiwmodel 传递给视图,

public ViewResult Index()
{
    masterViewModel sitesModel = new masterViewModel();

    return View(sitesModel);
}

那么在我看来,我有以下几点,

@model IEnumerable<trsDatabase.Models.masterViewModel>

foreach (var site in customer.CustomerSites)
{
    foreach (var cust in customer.Customers)
    {
        <tr>
            <td>
                @cust.CustomerName
            </td>
            <td>
                @site.UnitNo
            </td>

使用上面的代码,我可以访问视图模型中两个列表中的所有属性,但是当我导航到视图时,我得到一个错误,因为视图需要一个 IEnumerable。如果我将声明更改为仅传递视图模型

@model trsDatabase.Models.masterViewModel

foreach 语句不起作用,它给出了这个错误

传入字典的模型项的类型为“trsDatabase.Models.masterViewModel”,但此字典需要类型为“System.Collections.Generic.IEnumerable`1[trsDatabase.Models.masterViewModel]”的模型项。

谁能提供任何建议或指出正确的方向来解决这个问题,是否可以使我的视图模型 IEnumerable?

【问题讨论】:

  • 在一个不相关的注释中,您拥有这些嵌套循环的方式,您会发现同一个客户在每个站点上显示多次。我的猜测是 CustomerSite 和 Customer 以某种方式相关,您希望在 CustomerSite.Customers 上使用导航属性/集合,或者将其展平。

标签: c# asp.net-mvc model viewmodel


【解决方案1】:

是的,你可以... 在您的模型(masterViewModel)中,使客户和客户站点列表如下:

namespace trsDatabase.Models
{
public class masterViewModel
{
    public List<Customer> Customers { get; set; }
    public List<CustomerSite> CustomerSites { get; set; }
}
}

在同一个模型中,定义一个返回 IEnumerable 的方法,如下所示:

public IEnumerable<Customer> Getall()
        {
            List<Customer> lcustomer= new List<Customer>();
            //Get Customer data from Database or wherever
            lcustomer.Add(new Customer{ firstname= "Quentin ", lastname= "tarantino" });
            return lcustomer;
        }

在您的控制器中,实例化您的模型。然后调用 Getall() 方法,该方法将返回 IEnumerable 基本上是一个客户列表,并将其传递给您的视图

var rep = new masterViewModel();
var model = rep.Getall();
return View(model);

【讨论】:

    【解决方案2】:

    改变这个

    @model IEnumerable<trsDatabase.Models.masterViewModel>
    

    到这里

    @model trsDatabase.Models.masterViewModel
    

    您正在传递 masterViewModel 的单个实例,因此您的视图应该期望单个实例,如果不是以一种神秘的方式,这正是错误告诉您的内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-27
      • 1970-01-01
      相关资源
      最近更新 更多