如何制作IEnumerable类型的Viewmodel?

时间:2011-05-13 09:50:26

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

我使用以下代码作为包含两个数据列表的主视图模型

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>

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

@model trsDatabase.Models.masterViewModel

foreach语句不起作用,它会出现此错误

  

传递到字典中的模型项的类型为'trsDatabase.Models.masterViewModel',但此字典需要类型为'System.Collections.Generic.IEnumerable`1 [trsDatabase.Models.masterViewModel]'的模型项。 / p>

任何人都可以提出任何建议或指出我正确的方向来解决这个问题,是否可以使我的viewmodel IEnumerable?

2 个答案:

答案 0 :(得分:2)

更改此

@model IEnumerable<trsDatabase.Models.masterViewModel>

到这个

@model trsDatabase.Models.masterViewModel

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

答案 1 :(得分:1)

是的你可以...... 在你的模型(masterViewModel)中像这样生成Customers和CustomerSites List:

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

在同一个Model中,定义一个像这样返回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客户列表,并将其传递给您的View

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