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

.Net Core MVC中EF实体非数据库字段输入值传递到购物车问题

问题根因

  • 你当前用<a>标签跳转发起GET请求,不会携带输入框中用户填写的数量值,后台接口根本没拿到用户输入的数值
  • 属性名不一致:模型中定义的非映射字段名为QuantityRequired,但视图和控制器代码中写的是QuantityReq,拼写不匹配
  • 你试图从数据库查询返回的Inventory实体中读取QuantityRequired值,该字段是[NotMapped]的,不会从数据库加载,默认值就是0,自然拿不到用户输入的内容

解决步骤

  1. 统一属性名,保持视图、控制器中用到的字段名和模型中定义的QuantityRequired一致
  2. 调整视图提交逻辑,使用表单提交的方式把用户输入的数量传递到后台接口,示例视图代码如下:
@foreach (var item in Model)
{
  <tr>
    <!-- 原有库存展示字段的td省略 -->
    <td>
      <form asp-controller="Cart" asp-action="Buy" method="get">
        <input type="hidden" name="customerID" value="@custID.CustomerId" />
        <input type="hidden" name="inventoryID" value="@item.InventoryId" />
        <input type="number" min="1" name="quantityRequired" value="1" required />
        <button type="submit">Buy Now</button>
      </form>
    </td>
  </tr>
}
  1. 调整CartController的Buy接口,增加参数接收前端传递的购买数量,直接使用该参数赋值给购物车项的Quantity字段:
public async Task<IActionResult> Buy(int? customerID, int? inventoryID, int quantityRequired)
{
    if (customerID == null || inventoryID == null || quantityRequired < 1)
    {
        return NotFound();
    }

    Customer custData = await _context.Customers.FindAsync(customerID);
    var intData = await _context.Inventories.FindAsync(inventoryID);

    // 可选增加库存校验逻辑
    if (quantityRequired > intData.QuantityAvailable)
    {
        return Content("库存不足");
    }

    var cart = SessionHelper.GetObjectFromJson<List<Item>>(HttpContext.Session, "cart") ?? new List<Item>();
    cart.Add(new Item
    {
        Custom = custData,
        Inventory = intData,
        Quantity = quantityRequired
    });
    SessionHelper.SetObjectAsJson(HttpContext.Session, "cart", cart);
       
    return RedirectToAction("Index");
}

调整完成后,用户输入的购买数量就会正常传递到后台,存入购物车后展示在购物车页面。

内容的提问来源于stack exchange,提问作者trx

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 10:24:05