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

ASP.NET MVC 购物车结账时商品库存扣减功能问题咨询

你当前代码存在3个核心问题导致库存扣减不生效:

  1. 前端结账逻辑顺序错误:点击结账按钮后直接先清空了购物车Session,导致后续调用Checkout接口时拿不到任何购物车商品数据,自然无法扣减库存
  2. 库存扣减逻辑缺失校验:没有判断商品库存是否足够覆盖用户购买数量,可能出现负数库存
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 12:54:01