我到处查找,尝试了多种解决方案,但都不起作用。在我的MVC网站中,我有一个购物车部分和一个结账部分。我想把它放在我的结账区,我有一个小推车区来展示推车。
这是我的部分视图_CartItems.shtml
@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();
}
我尝试了许多解决方案,但都返回相同的错误。我错过了什么?
我认为这里有一个根本的误解:@Html.Partial("_CartItems", Model.Cart)
不会调用您的_CartItems()
操作。相反,它将创建一个_CartItems.cshtml
局部视图的新实例,并使用Model.Cart
参数作为Model
。
在这种情况下,有两个问题:
_CartItems.cshtml
期望一个类型为IEnumerable<ArrowDefenseSystems.Models.Cart>
的模型,而您正在通过Model.Cart
参数传递一个类型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
操作,因为它不再使用。