ASP.NET MVC查询到ViewModel

时间:2015-02-18 16:56:37

标签: asp.net asp.net-mvc-4

我有一个非常简单的ViewModel(ProductViewModel)

 public class ProductViewModel
 {
    public int ProductID { get; set; }
    public int CategoryID { get; set; }
    public string ProductName { get; set; }
    public string CategoryName { get; set; }
 }

在我的控制器中,我抓住了一个特定的产品

var product = _context.Products
            .Select(p => new ViewModels.ProductViewModel
            {
                CategoryID = p.Category.CategoryID,
                ProductID = p.ProductID,
                ProductName = p.ProductName,
                CategoryName = p.Category.CategoryName
            }).Where(p => p.ProductID == id);
        return View(product);

在我看来,我将模型定义为

@model MvcApplication1.ViewModels.ProductViewModel

但是,我收到此错误:

  

传递到字典中的模型项的类型为&System; System.Data.Entity.Infrastructure.DbQuery`1 [MvcApplication1.ViewModels.ProductViewModel]',但此字典需要类型为&的模型项#39; MvcApplication1.ViewModels.ProductViewModel'

我不确定为什么它会抛出该错误,因为我将ProductViewModel传递到视图中...至少看起来像我。任何指导将不胜感激

谢谢!

1 个答案:

答案 0 :(得分:2)

您需要执行查询以获取实际的对象类型。调用FirstOrDefault()或ToList()将执行查询。还有.First(),如果在执行查询后找不到该项,则抛出异常。

试试这个:

 Select(p => new ViewModels.ProductViewModel
{
    CategoryID = p.Category.CategoryID,
    ProductID = p.ProductID,
    ProductName = p.ProductName,
    CategoryName = p.Category.CategoryName
}).Where(p => p.ProductID == id).FirstOrDefault();//Executes the query

循环结果集也将执行查询。所以,如果你做了类似下面的事情,你就不需要调用FirstOrDefault()或ToList()。

foreach(var item in product)//IF YOU HAVE MULTIPLE ITEMS
     item.//THIS IS A SINGLE PRODUCTVIEWMODEL INSTANCE NOW