将 PartView 链接到视图将返回 System.Web.Mvc.WebViewPage<TModel>。Model.get 返回空值



我到处查找,尝试了多种解决方案,但都不起作用。在我的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操作,因为它不再使用。

最新更新