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
相关产品推荐
相关产品推荐

