在MVC视图中显示存储过程的结果(EF 5 / MVC 4)

时间:2013-06-12 14:30:27

标签: c# mysql entity-framework stored-procedures entity-framework-5

目标

我想在我的视图中显示存储过程的结果。

问题

实体框架自动为我导入了一个执行程序的方法,但是我没有得到我期望在屏幕上显示的结果。

导入的功能是:

public virtual ObjectResult<getProductsListForHome_Result> getProductsListForHome(Nullable<int> inOffer, Nullable<int> categoryId)
{
    var inOfferParameter = inOffer.HasValue ?
        new ObjectParameter("inOffer", inOffer) :
        new ObjectParameter("inOffer", typeof(int));

    var categoryIdParameter = categoryId.HasValue ?
        new ObjectParameter("categoryId", categoryId) :
        new ObjectParameter("categoryId", typeof(int));

    return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<getProductsListForHome_Result>("getProductsListForHome", inOfferParameter, categoryIdParameter);
}

我已经尝试了什么

在ProductsController上:

//
// GET: /Products/
public ActionResult Index()
{
    ObjectResult<getProductsListForHome_Result> products = db.getProductsListForHome(1, 14);
    return View(products.ToList());
}

使用上面的代码,当我访问http://myapp.com/Products/时,我收到以下消息:

  

传递到字典中的模型项是类型的   'System.Collections.Generic.List 1[MyApp.Models.getProductsListForHome_Result]', but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable 1 [MyApp.Models.bm_products]'。

我该怎么做才能解决这个问题?

2 个答案:

答案 0 :(得分:3)

首先,写得很好的问题!

这是一个类型转换问题,看起来您的回答是接受的答案:

MVC: The model item passed into the dictionary is of type X, but this dictionary requires a model item of type X

答案 1 :(得分:2)

您的View很可能是一个强类型的视图,它被声明为

@model System.Collections.Generic.IEnumerable<MyApp.Models.bm_products>

但是,您在控制器中传递了不同的类型,并遇到错误。

你能做什么:

  1. 为视图指定其他类型。在此之后,查看本身可能需要进行一些重构:

    @model System.Collections.Generic.IEnumerable<MyApp.Models.getProductsListForHome_Result>
    
  2. 优选的。在控制器中运行一些代码,将从SP返回的集合转换为View可以使用的内容:

    public ActionResult Index()
    {
        ObjectResult<getProductsListForHome_Result> products = db.getProductsListForHome(1, 14);
    
        List<bm_products> viewProducts = products.Select(p => new bm_products{ProductName = p.Name, ProductPrice = p.Price}).ToList();
    
        return View(viewProducts);
    }