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.IEnumerable1[MyApp.Models.bm_products]”。

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

4

2 回答 2

3

首先,写得很好的问题!

这是一个类型转换问题,看起来您的答案是这里公认的答案:

MVC:传入字典的模型项是X类型的,但是这个字典需要X类型的模型项

于 2013-06-12T14:36:02.590 回答
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);
    }
    
于 2013-06-12T14:37:43.887 回答