我到处查找并尝试了多种解决方案,但没有一个可行。在我的MVC网站上,我有一个购物车部分和一个结帐部分。我想在结帐部分中做到这一点,我有一个小的购物车部分来显示购物车。
这是我的局部视图_CartItems.cshtml
@model IEnumerable<ArrowDefenseSystems.Models.Cart>
@{
ViewBag.Title = "Your Cart";
}
@if (Model != null)
{
foreach (var item in Model)
{
<div class="itemInfo row">
<img class="col-md-3" src="@Url.Content("~/Content/" + @Html.DisplayFor(modelItem => item.productImage))" height="100px">
<div class="CartItemText col-md-9">
<h3>@Html.DisplayFor(modelItem => item.productName)</h3>
<i>$@Html.DisplayFor(modelItem => item.productPrice)</i><br>
Quantity : @Html.DisplayFor(modelItem => item.quantityChosen)<br>
</div>
</div>
<hr />
}
}
当我单独启动“局部视图”时,它可以很好地显示项目,并且一切运行正常。
这是将部分视图链接到Checkout.cshtml视图的方式
@model ArrowDefenseSystems.Models.ParentViewModel
...
...
@Html.Partial("_CartItems", Model.Cart)
运行此代码时,我在上面的代码中收到以下错误:
System.NullReferenceException: 'Object reference not set to an instance of an object.'
System.Web.Mvc.WebViewPage<TModel>.Model.get returned null.
ParentViewModel:
public class ParentViewModel
{
public Checkout Checkout { get; set; }
public Cart Cart { get; set; }
}
结帐控制器(更多,但不必要):
[HttpGet]
public ActionResult _CartItems()
{
return PartialView(db.Carts.ToList());
}
public ActionResult Checkout()
{
return View();
}
我尝试了许多解决方案,但所有解决方案都返回相同的错误。我想念什么?
答案 0 :(得分:0)
我认为这里有一个基本的误解:@Html.Partial("_CartItems", Model.Cart)
不会调用您的_CartItems()
动作。相反,它将创建_CartItems.cshtml
部分视图的新实例,并使用Model.Cart
参数作为Model
。
在这种情况下,有两个问题:
_CartItems.cshtml
期望使用类型为IEnumerable<ArrowDefenseSystems.Models.Cart>
的模型,而您正在通过Cart
参数将模型传递为Model.Cart
的模型Model.Cart
未在您的Checkout
操作中实例化因此,要解决此问题,您首先应将ParentViewModel
更改为:
public class ParentViewModel
{
public Checkout Checkout { get; set; }
public IEnumerable<Cart> Carts { get; set; }
}
然后,将您的Checkout
操作更新为:
public ActionResult Checkout()
{
var viewModel = new ParentViewModel
{
Carts = db.Carts.ToList()
}
return View(viewModel);
}
并将您的Model.Cart
的使用更改为Model.Carts
(由于上面的重命名)
之后,您可以删除_CartItems
操作,因为它不再使用了。