JsonConvert.SerializeObject抛出自引用错误

时间:2019-02-12 14:09:45

标签: c# asp.net-core

我正在一家带有购物车的Pizza Store中工作,该购物车使用会话来存储购物车并返回它具有部分视图以通过AJAX更新购物车。

直到最近,该方法一直运行良好,我没有对该方法或CartController本身进行任何特定更改。但是我一直在管理页面上添加更多产品,该产品正在按预期方式工作,完全不会影响这部分。

我已经使用Visual Studio逐步浏览代码,它调用正确的方法并获取正确的值,但是它止于此行 var temp = JsonConvert.SerializeObject(cart); 它扔在哪里 无法加载资源:服务器响应状态为500(),可以在浏览器控制台中看到。

完整路径为:

[https://localhost:44341/cart/product/1?X-Requested-With=XMLHttpRequest&_=1549979834762]
   [Route("product/{id}")]
   public async Task<IActionResult> AddItem(int id)
    {
        var user = await _userManager.GetUserAsync(User);
        if (user == null) Challenge();

        ShoppingCart cart;

        var product = await _dishService.GetDishAsync(id);

        // If shopping cart doesn't exist
        if (HttpContext.Session.GetString("varukorg") == null)
        {
            cart = new ShoppingCart
            {
                Products = new List<Matratt>(),
                User = user,
                Kund = await _userService.FindUserAsync(user.Id)
            };
        }
        else
        {
            // Else get the session and cast it as cart
            var serializedValue = ( HttpContext.Session.GetString("varukorg") );
            cart = JsonConvert.DeserializeObject<ShoppingCart>(serializedValue);
        }
        cart.Products.Add(product);

        // Added product, putting the session back.
        var temp = JsonConvert.SerializeObject(cart);
        HttpContext.Session.SetString("varukorg", temp);
        return PartialView("_CartList", cart);
    }

然后通过不显眼的AJAX从视图中调用该方法,该方法到目前为止一直运行良好。

<a class="btn btn-sm btn-success"
      data-ajax="true"
      data-ajax-method="GET"
      data-ajax-mode="replace"
      data-ajax-update="#cartList"
      asp-controller="Cart" asp-action="AddItem" asp-route-id="@item.Id">+ 
</a>

使用ViewModel

    public List<Matratt> Products { get; set; }
    public AppUser User { get; set; }
    public Kund Kund { get; set; }
    public bool CalculatedPoints { get; set; }

2 个答案:

答案 0 :(得分:0)

此解决方案已存在于另一个线程中,请找到链接JSON.NET Error Self referencing loop detected for type

答案 1 :(得分:0)

当我从服务类中请求该对象时,我也使用了一种通用方法来获取导航对象,在这种情况下,这似乎是导致自引用错误的原因。

return await _context.Matratt
            .Include(m => m.MatrattProdukt)
            .ThenInclude(p => p.Produkt)
            .FirstOrDefaultAsync(m => m.MatrattId == id);

更改为仅

 return await _context.Matratt.FirstOrDefaultAsync(p => p.MatrattId == id);

这是购物车真正唯一需要的东西。