我创建了一个局部视图,它返回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而不是部分视图,但我不确定哪种情况适合。
答案 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的快速经验法则。
希望有所帮助!