ASP.NET MVC 购物车结账时商品库存扣减功能问题咨询
你当前代码存在3个核心问题导致库存扣减不生效:
- 前端结账逻辑顺序错误:点击结账按钮后直接先清空了购物车Session,导致后续调用Checkout接口时拿不到任何购物车商品数据,自然无法扣减库存
- 库存扣减逻辑缺失校验:没有判断商品库存是否足够覆盖用户购买数量,可能出现负数库存
- PayPal参数拼写错误:表单里的数量参数拼写成了
quantitiy(多了一个i),会导致PayPal侧接收数量错误
具体修改步骤
1. 修改Cart.cshtml里的结账脚本
把原来的script部分改成先调用Checkout接口,成功后再清空购物车、提交PayPal表单:
$(function () { $("a.checkout").click(function (e) { e.preventDefault(); $("div.cartbg").removeClass("d-none"); // 先调用扣库存接口,成功后再清购物车、跳支付 $.get("/cart/checkout", {}, function () { $.get("/cart/clear", {}, function () { $("form.paypalform").submit(); }); }).fail(function() { alert("库存不足,结账失败,请调整购物车商品数量后重试"); $("div.cartbg").addClass("d-none"); }); }); });
2. 优化CartController里的Checkout方法
增加库存充足校验,统一提交数据库变更,提升性能和数据一致性:
public async Task<IActionResult> Checkout() { List<CartItem> cart = HttpContext.Session.GetJson<List<CartItem>>("Cart") ?? new List<CartItem>(); if (cart.Count == 0) { return BadRequest("购物车为空"); } // 先校验所有商品库存是否足够 foreach (var item in cart) { var product = await context.Products.FindAsync(item.ProductId); if (product == null || product.Quantity < item.Quantity) { return BadRequest($"商品{item.ProductName}库存不足"); } // 扣减库存 product.Quantity -= item.Quantity; } // 统一提交所有变更,避免多次访问数据库 await context.SaveChangesAsync(); return Ok(); }
3. 修复PayPal部分视图的参数拼写错误
打开_PayPalPartial.cshtml,把数量参数的name从quantitiy_@count改成quantity_@count:
<input type="hidden" name="quantity_@count" value="@item.Quantity" />
修改完成后,点击结账时会先校验所有商品库存、完成扣减后再清空购物车跳转到PayPal支付,库存就能正常同步更新。
内容的提问来源于stack exchange,提问作者judy_may
相关产品推荐
相关产品推荐

