如果另一个局部视图使用不同的模型,如何使用特定模型传递局部视图?

时间:2017-01-27 20:48:51

标签: c# asp.net-mvc

我正在尝试在我的页面上查看已经使用不同视图模型的购物车。这是我的布局:

@RenderBody()
....
<div id="cd-shadow-layer"></div>
<div id="cd-cart">
    @Html.Partial("_ItemsCartPartial", (Model as List<TShirtEmpAdmin.Models.Order>))
</div>

正文中呈现的视图正在使用

@model TShirtEmpAdmin.ViewModels.ShirtOrdersViewModel

html partial渲染

@model IEnumerable<TShirtEmpAdmin.Models.Order>
  

传递到字典中的模型项类型为&#39; ViewModels.ShirtOrdersViewModel&#39;,但此字典需要类型为&#39; Models.Order&#39;的模型项。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

发生错误是因为您的视图使用的是ShirtOrdersViewModel类型的模型,并且其布局正在调用期望List<Order>的部分。因为布局有

@Html.Partial("_ItemsCartPartial", (Model as List<Order>))

您正在尝试将ShirtOrdersViewModel转换为List<Order>的模型失败,其结果与

相同
@Html.Partial("_ItemsCartPartial", null)

当您将null作为模型传递时,该方法使用主视图的ViewDataDictionary,因此该方法现在将ShirtOrdersViewModel传递给部分期望List<Order>,因此例外。

您当前的实现意味着您的布局只能由模型为List<Order>的视图使用(或者是从包含属性List<Order>的BaseModel派生的模型,在这种情况下您可以使用@Html.Partial("_ItemsCartPartial", Model.MyListOfOrdersProperty))。但是,在您的情况下这将是错误的方法,而是您应该创建一个返回PartialView订单的方法,例如

[ChildActionOnly]
public ActionResult Orders()
{
    List<Order> orders = .... // get orders for the current user
    return PartialView("_Orders", orders);
}

并且_Orders.cshtml文件将有@model List<Order>以及显示它们的代码。然后在布局中,使用

渲染部分结果
@{ Html.RenderAction("Orders", yourControllerName); }