1

我创建了一个局部视图,它返回一个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 而不是 Partial 视图,但我不确定哪种情况适合。

4

1 回答 1

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})

使用第二个选项,将执行控制器操作方法中的逻辑,从数据库中检索 ItemOptions,呈现部分视图并将生成的 html 包含到您的主视图中。

您可以在此处找到 Html.Partial 和 Html.Action 用法的快速经验法则。

希望有帮助!

于 2013-09-01T14:00:39.230 回答