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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 09:01:14