【问题标题】:Problem passing data from repository to viewmodel将数据从存储库传递到视图模型的问题
【发布时间】:2012-01-15 16:19:07
【问题描述】:

我有以下视图模型,

public class SiteAdminCreateViewModel
{
    public Customer Customer { get; private set; }
    public CustomerSite CustomerSite { get; private set; }
    public SelectList CustomerNames { get; private set; }

    public SiteAdminCreateViewModel(CustomerSite customerSite, Customer customer)
    {
        CustomerSite = customerSite;
        Customer = customer;
        CustomerNames = new SelectList(customer.CustomerName);
    }
}

以及我的存储库中用于返回客户列表和 CustomerSites 列表的以下方法

 public IQueryable<CustomerSite> GetCustomerSites
    {
        get { return context.CustomerSites; }
    }
    public IQueryable<Customer> GetCustomers
    {
        get { return context.Customers; }
    }

当我在控制器中实例化视图模型时,我希望将客户列表返回给视图模型中的选择列表。

 public ViewResult Create() 
    {
        CustomerSite customerSite = new CustomerSite();
        var customer = repository.GetCustomers.ToList();
        return View(new SiteAdminCreateViewModel(customerSite, customer));       
    }

但是返回行抛出错误

无法从 System.Collections.Generic.List' 转换为 'CustomerOrders.Domain.Entities.Customer

我认为这是因为我在客户类型的 Viewmodel 中定义了客户变量,但我试图传递客户列表?

任何人都可以就我在这里出错的地方提供任何建议吗?

我是否需要在视图模型中同时定义客户类型和客户名称选择列表类型,我只定义了客户对象,所以我可以使用它将客户传递给选择列表,但我不确定这是否是最好的如何做到这一点?

任何人都可以为新手提供任何建议,我们将不胜感激。

【问题讨论】:

    标签: asp.net-mvc-3 entity-framework-4 viewmodel


    【解决方案1】:

    您的SiteAdminCreateViewModel 类的构造函数定义如下:

    public SiteAdminCreateViewModel(CustomerSite customerSite, Customer customer) {
       ...
    }
    

    它的第二个参数的类型是Customer

    您将var customer = repository.GetCustomers.ToList() 传递给它,其类型为List&lt;Customer&gt;


    当我在控制器中实例化视图模型时,我想要 将要传递的客户列表返回到 视图模型。

    如果我理解你所说的正确,你只是想通过客户列表来构建SelectList

    首先,您似乎将一个字符串传递给SelectList 构造函数。这甚至无法编译(阅读System.Web.Mvc.SelectList)。

    你需要做的是改变SiteAdminCreateViewModel的构造函数

    public SiteAdminCreateViewModel(CustomerSite customerSite, IEnumerable<Customer> customers) {
       /* ... */
       CustomerNames = new SelectList(customers, "CustomerId", "CustomerName");
    }
    

    CustomerIdCustomerNameCustomer 类的属性。

    【讨论】:

    • 感谢您的建议,我更改了构造函数,您能否就如何使用 IQueryable 方法从存储库返回客户提供任何建议,以适应 ICollection,因为我收到另一个转换错误说明无法从 IQueryable 转换为 ICollection,再次感谢
    • @Liam,改用IEnumerable
    • 试过了,但我仍然得到转换错误,无法从 IEnumerable 转换为 ICollection。
    【解决方案2】:

    这仅仅是因为您试图将 IList 传递给 SiteAdminCreateViewModel 的构造函数

    var customer = repository.GetCustomers.ToList();
            return View(new SiteAdminCreateViewModel(customerSite, customer));
    

    使用

    var customer = repository.GetCustomers.ToList().FirstOrDefault();
                return View(new SiteAdminCreateViewModel(customerSite, customer));
    

    可以,您可能还需要检查客户是否为空

    【讨论】:

      猜你喜欢
      • 2012-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多