簡體   English   中英

將PartialView鏈接到View返回System.Web.Mvc.WebViewPage <TModel> .Model.get返回null

[英]Linking PartialView to View returns System.Web.Mvc.WebViewPage<TModel>.Model.get returned null

我到處查找並嘗試了多種解決方案,但沒有一個可行。 在我的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 />
    }
}

當我單獨啟動Partial View時,它可以很好地顯示項目,並且一切運行正常。

這就是我將部分視圖鏈接到視圖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; }
}

Checkout控制器(更多功能,但不必要):

[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>的模型,而您正在將其傳遞為具有Cart類型的模型(通過Model.Cart參數)
  • 未在Checkout操作中實例化Model.Cart

因此,要解決此問題,您首先應該將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.CartModel.Carts (由於上述重命名)

之后,您可以刪除_CartItems操作,因為它不再使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM