将PartialView链接到View将返回System.Web.Mvc.WebViewPage <tmodel> .Model.get返回null

时间:2018-10-27 16:15:25

标签: c# asp.net-mvc entity-framework

我到处查找并尝试了多种解决方案,但没有一个可行。在我的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();

}

我尝试了许多解决方案,但所有解决方案都返回相同的错误。我想念什么?

1 个答案:

答案 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操作,因为它不再使用了。