首页 > 解决方案 > dotnet core 2 Web C# 对象引用未设置为对象的实例?

问题描述

尝试将产品添加到购物车时出现空异常

在下面的代码部分中,当我运行项目时,它似乎可以正常工作,但是当我尝试将产品添加到购物车时,它会抛出异常。我真的很紧张……我要离开这个了。

@model Produto
@{
    <div class="card text-right" style="width: 20rem;">
        <div class="card-body">
            <h4 class="card-title">@Model.Nome</h4>
            <h3 class="card-title">@Model.Preco.ToString("c")</h3>
        </div>
        <form id="@Model.ProdutoID" asp-action="AddPCarrinho"
              asp-controller="Carrinho" method="post">
            <input type="hidden" asp-for="ProdutoID" />
            <input type="hidden" name="returnUrl"
                        value="@ViewContext.HttpContext.Request.PathAndQuery()" />
            <span class="card-text p-1">
                @Model.Descricao
                <button type="submit" class="btn btn-success btn-sm pull-right" style="float:right">
                    Add to Cart
                </button>
            </span>
        </form>
    </div>
}

这是控制器

public class CarrinhoController : Controller
{
    private IProdutoRepositorio repositorio;

    public CarrinhoController(IProdutoRepositorio repo)
    {
        repositorio = repo;
    }
    public ViewResult Index(string returnUrl)
    {
        return View(new CarrinhoIndexViewModel
        {
            Carrinho = GetCarrinho(),
            ReturnUrl = returnUrl
        });
    }

    public RedirectToActionResult AddPCarrinho(Guid produtId, string returnUrl)
    {
        Produto produto = repositorio.All
            .FirstOrDefault(p => p.ProdutoID == produtId);

        if (produtId != null)
        {
            Carrinho carrinho = GetCarrinho();
            carrinho.AddItem(produto, 1);
            SalvarCarrinho(carrinho);
        }
        return RedirectToAction("Index", new { returnUrl });
    }

}

这是视图模型

namespace SportsStore.Models.ViewModels{
        public class CarrinhoIndexViewModel{
            public Carrinho Carrinho { get; set; }
            public string ReturnUrl { get; set; }
        }
    }

这是我得到异常空引用的类

public class Carrinho{
        private List<CartLine> lineCollection = new List<CartLine>();

        public virtual void AddItem(Produto produto, int quantidade){
            CartLine line = lineCollection
                .Where(p => p.Produto.ProdutoID == produto.ProdutoID)
                .FirstOrDefault();


            if (line == null)
            {
                lineCollection.Add(new CartLine
                {
                    Produto = produto,
                    Quantidade = quantidade
                });
            }
            else
            {
                line.Quantidade += quantidade;
            }
        }

json.net 类

public static class SessionExtensions
    {
        public static void SetJson(this ISession sessao, string key, object value)
        {
            sessao.SetString(key, JsonConvert.SerializeObject(value));
        }

        public static T GetJson<T>(this ISession sessao, string key)
        {
            var sessaoData = sessao.GetString(key);
            return sessaoData == null
                ? default(T) : JsonConvert.DeserializeObject<T>(sessaoData);
        }
    }

标签: c#json.net.net-core

解决方案


在控制器中,更改行

if (produtId != null)

if (produto != null)

就目前而言,您没有检查是否从存储库中获取了某些内容。


推荐阅读