You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core 6.0添加购物车代码失效求助:替换ID后无法工作

问题排查与修复方案

核心问题分析

1. 前端参数传递错误

  • 循环渲染的每个表单都包含id="Id"的隐藏输入框,DOM中ID必须唯一,$("#Id").val()只会获取第一个输入框的固定值(1),无法匹配当前点击的商品ID。
  • submitData函数定义未接收参数,但按钮点击时传入了@item.ProductId,导致传入的商品ID完全未被使用。

2. 控制器成功分支缺少返回值

当购物车中已存在该商品时,执行完cartItemManager.ItemUpdate(cart)后没有返回成功的JSON响应,代码会继续执行到最后的失败返回语句,导致前端收到错误提示。

3. 异步调用同步阻塞风险

使用_userManager.FindByNameAsync(userName).Result同步阻塞获取用户信息,可能引发死锁,建议改用异步await方式。


修复后的代码

前端HTML/JS修正

@foreach (var item in Model)
{
    <!-- 移除冗余表单与重复ID,直接传递商品ID参数 -->
    <button type="button" onclick="submitData(@item.ProductId)" class="btn btn-dark">
        <span class="fa fa-shopping-cart"></span>Add Basket
    </button>
}
<script>
    // 接收商品ID参数,直接用于请求
    function submitData(productId) {
        $.ajax({
            type: "POST",
            url: '@Url.Action("addToBasket", "Home")',
            data: { "id": productId },
            success: function (data) {
                console.log(data.msg);
            },
            error: function(xhr) {
                console.log("请求错误:", xhr.responseText);
            }
        });
    }
</script>

后端控制器修正

[HttpPost]
[Authorize]
// 改为异步方法,避免同步阻塞死锁
public async Task<IActionResult> addToBasket(int id)
{
    try
    {
        if (User.Identity.IsAuthenticated)
        {
            var userName = User.Identity.Name;
            // 异步获取用户信息
            var user = await _userManager.FindByNameAsync(userName);
            var product = cartItemRepository.GetById(id);

            if (user != null && product != null)
            {
                var cart = cartItemRepository.List(x => x.UserId == user.Id && x.ProductId == id).FirstOrDefault();

                if (cart != null)
                {
                    cart.Quantity += 1;
                    cartItemManager.ItemUpdate(cart);
                    // 新增更新成功的返回响应
                    return Json(new { status = true, msg = "商品数量已更新" });
                }
                else
                {
                    var newCartItem = new CartItem
                    {
                        UserId = user.Id,
                        ProductId = id,
                        Quantity = 1,
                        ProductName = product.ProductName,
                        Price = product.Price,
                        Title = product.Title,
                    };
                    cartItemManager.ItemAdd(newCartItem);

                    return Json(new { status = true, msg = "商品已添加到购物车" });
                }
            }
        }

        return Json(new { status = false, msg = "无法将商品添加到购物车" });
    }
    catch (Exception ex)
    {
        var errorMsg = ex.Message;
        var innerException = ex.InnerException;
        // 拼接所有内部异常信息,方便排查
        while (innerException != null)
        {
            errorMsg += $" | {innerException.Message}";
            innerException = innerException.InnerException;
        }
        return Json(new { status = false, msg = "添加商品时发生错误: " + errorMsg });
    }
}

额外优化建议

  • 前端可添加按钮loading状态,防止用户重复点击;
  • 后端建议注入ILogger记录异常日志,便于线上问题排查;
  • 仓储层查询可改用异步方法(如FirstOrDefaultAsync),进一步提升性能。

内容的提问来源于stack exchange,提问作者jr.Dev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 17:40:04