.Net Core MVC中EF实体非数据库字段输入值传递到购物车问题
问题根因
- 你当前用
<a>标签跳转发起GET请求,不会携带输入框中用户填写的数量值,后台接口根本没拿到用户输入的数值 - 属性名不一致:模型中定义的非映射字段名为
QuantityRequired,但视图和控制器代码中写的是QuantityReq,拼写不匹配 - 你试图从数据库查询返回的
Inventory实体中读取QuantityRequired值,该字段是[NotMapped]的,不会从数据库加载,默认值就是0,自然拿不到用户输入的内容
解决步骤
- 统一属性名,保持视图、控制器中用到的字段名和模型中定义的
QuantityRequired一致 - 调整视图提交逻辑,使用表单提交的方式把用户输入的数量传递到后台接口,示例视图代码如下:
@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> }
- 调整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
相关产品推荐
相关产品推荐

