PartialView导致错误

时间:2013-09-01 13:22:42

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

我创建了一个局部视图,它返回ItemsId匹配传递给它的项目列表。

//
// GET: /ItemOptions/Item/5
public ActionResult Item(int id = 0)
{
    var itemoptions = db.ItemOptions.Where(o => o.ItemsId == id);
    return PartialView(itemoptions.ToList());
}

我正在尝试使用以下代码在父项的详细信息页面上显示它:

@Html.Partial("../ItemOptions/Item", Model.ItemsId)

如果我访问{URL} / ItemOptions / Item / 1,它将返回我希望看到的表。但是,如果我导航到我试图包含局部视图的父项,我会收到以下错误:

  

传递到字典中的模型项的类型为'System.Int32',但此字典需要类型为'System.Collections.Generic.IEnumerable`1 [shopServer.Models.ItemOptions]'的模型项。

我已阅读其他帖子,但无法解决我出错的地方。我还读到我可能需要使用@ Html.Action而不是部分视图,但我不确定哪种情况适合。

1 个答案:

答案 0 :(得分:2)

方法Html.Partial直接渲染局部视图(不执行控制器逻辑),使用第二个参数中传递的对象作为模型实例。因此,如错误所示,代码行@Html.Partial("../ItemOptions/Item", Model.ItemsId)正在尝试使用整数(Model.ItemsId)作为模型呈现部分视图,但部分视图需要IEnumerable[shopServer.Models.ItemOptions]

您有2个选项可以解决您的问题,具体取决于部分视图的数据是否已加载到父视图的模型中。

如果在父视图中模型已包含项选项集合,则可以使用Html.Partial方法将它们传递到局部视图。因此,假设您可以在父视图的模型中拥有类似ItemOptions的属性,那么您可以将部分渲染为:

@Html.Partial("../ItemOptions/Item", Model.ItemOptions)

如果不可能,并且父模型不知道部分视图所需的数据,那么您需要执行控制器逻辑(这样您就可以填充部分视图的模型,从中检索额外的数据)数据库。)在这种情况下,您需要的是子操作,使用方法Html.Action获得。您需要传递操作方法的控制器名称,操作名称和参数,如下所示:

@Html.Action("Item", "ItemOptions", new {id = Model.ItemsId})

使用第二个选项,执行controller action方法中的逻辑,从数据库中检索ItemOptions,呈现局部视图并将生成的html包含在主视图中。

您可以找到Html.Partial和Html.Action用法`here的快速经验法则。

希望有所帮助!