ASP.NET中Foreach计算商品总价存入ViewBag展示异常问题求助
解决ViewBag仅显示最后一行购物车总价的问题
看起来你遇到的问题并不是后端ViewBag.Calc被覆盖——你的代码其实已经把所有商品的总价都存入了List集合里,只显示最后一行的原因大概率是前端页面没有正确遍历这个集合,只取了最后一个元素。另外你的后端代码可以做一些优化,让逻辑更清晰,还能避免潜在的数据对应错位问题。
问题分析
你当前的循环逻辑是正确的,已经把每个商品的单价×数量结果添加到了Calc列表,再赋值给ViewBag.Calc。但单独存一个总价列表的话,很容易出现“总价和商品对应不上”的情况(比如商品列表顺序变化时,总价列表的索引也会错位),更合理的做法是把商品信息和对应的总价绑定在一起。
最优解决方案:使用ViewModel
创建一个专门的ViewModel类,把商品信息、数量、单价和计算后的总价封装在一起,这样前端展示会更直观,也不会出现数据对应错误:
1. 创建ViewModel类
public class CartItemViewModel { // 关联的商品信息 public Product Product { get; set; } // 购买数量 public int Quantity { get; set; } // 商品当前单价 public decimal CurrentPrice { get; set; } // 商品总价(计算后) public decimal TotalPrice { get; set; } }
2. 修改Action代码
直接在数据库查询时计算总价并构建ViewModel列表,省去额外的循环,同时避免重复查询数据库:
public ActionResult Index() { string user_id = User.Identity.GetUserId(); // 获取当前用户未支付的订单ID var order_id = db.Orders .Where(x => x.User_Id == user_id && x.Paid == 0) .Select(x => x.Order_Id) .FirstOrDefault(); // 一次性查询订单详情、关联商品,并计算每个商品的总价 var cartItems = db.Order_details .Include(o => o.Product) // 关联商品表,获取商品详情 .Where(x => x.Order_Id == order_id) .Select(item => new CartItemViewModel { Product = item.Product, Quantity = item.Quantity, CurrentPrice = item.Current_price, TotalPrice = item.Quantity * item.Current_price // 直接在查询时计算,效率更高 }) .ToList(); // 直接把ViewModel列表传给View(比ViewBag更规范,类型更安全) return View(cartItems); }
3. 前端View展示
在View里直接遍历ViewModel列表,每个项都包含了需要的所有数据:
@model List<CartItemViewModel> <table> <thead> <tr> <th>商品名称</th> <th>购买数量</th> <th>单价</th> <th>总价</th> </tr> </thead> <tbody> @foreach (var item in Model) { <tr> <td>@item.Product.Name</td> <td>@item.Quantity</td> <td>@item.CurrentPrice.ToString("C")</td> <td>@item.TotalPrice.ToString("C")</td> </tr> } </tbody> </table>
如果你想保留原有的ViewBag方式
如果不想用ViewModel,那需要确保前端正确遍历ViewBag.Calc集合,比如:
@foreach (var totalPrice in ViewBag.Calc) { <p>@totalPrice.ToString("C")</p> }
同时可以简化后端的循环逻辑(不需要把Quantity转成字符串再转decimal,直接计算即可):
List<decimal> Calc = new List<decimal>(); foreach (var item in quantity_price) { // 假设Quantity是int类型,直接和decimal单价相乘 var calc = item.Quantity * Convert.ToDecimal(item.Current_price); Calc.Add(calc); } ViewBag.Calc = Calc;
内容的提问来源于stack exchange,提问作者CodingLegend
相关产品推荐
相关产品推荐

