При связывании PartialView с представлением возвращается System.Web.Mvc.WebViewPage <TModel>.Model.get, возвращаемый ноль - PullRequest
0 голосов
/ 27 октября 2018

Я посмотрел везде и попробовал несколько решений, но ни одно из них не сработало. На моем сайте 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; }
}

Checkout Controller (есть больше, но это не нужно):

[HttpGet]
public ActionResult _CartItems()
{
  return PartialView(db.Carts.ToList());
}
public ActionResult Checkout()
{

   return View();

}

Я перепробовал много решений, но все они возвращают одну и ту же ошибку. Чего мне не хватает?

1 Ответ

0 голосов
/ 27 октября 2018

Я думаю, здесь есть фундаментальное недоразумение: @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, поскольку оно больше не используется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...