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

如何在关联用户列的表格中正确展示交易金额?

问题分析与解决方案

核心问题

  1. 控制器逻辑错误:你在嵌套循环中每次都会覆盖transaction的UserId和Amount属性,最终每个交易对象只会保留最后一个匹配用户的金额,其他用户的关联信息被完全覆盖丢失。
  2. 视图查询逻辑错误:视图中仅通过UserId匹配交易,未关联TranId,导致无法定位到当前交易下对应用户的金额,显示结果完全偏离预期。

解决方案

1. 重构ViewModel结构

创建新的ViewModel类,用于存储单条交易及对应所有用户的金额映射:

public class TransactionWithUserAmounts
{
    public int Id { get; set; }
    public int TranId { get; set; }
    // 存储用户Id与对应交易金额的映射,无匹配则为null
    public Dictionary<int, decimal?> UserAmounts { get; set; } = new Dictionary<int, decimal?>();
}

// 更新TransactionListModel的TransactionList类型
public class TransactionListModel
{
    public List<TransactionWithUserAmounts> TransactionList { get; set; }
    public List<User> UserList { get; set; }
}

2. 修改控制器代码

移除原有的嵌套foreach循环,在分组时直接构建每个交易的用户金额字典:

using (var context = new SharedExpensesEntities())
{
    transactionsList = context.Transactions.ToList();
    usersList = context.Users.ToList();
}

var viewModel = new TransactionListModel
{
    TransactionList = transactionsList.GroupBy(x => x.TranId)
        .Select(g => new TransactionWithUserAmounts
        {
            Id = g.LastOrDefault().Id,
            TranId = g.Key,
            // 为每个用户匹配当前交易分组下的金额,无匹配则返回null
            UserAmounts = usersList.ToDictionary(
                user => user.Id,
                user => g.FirstOrDefault(t => t.UserId == user.Id)?.Amount
            )
        }).ToList(),
    UserList = usersList
};

3. 更新视图代码

遍历用户时,从当前交易的UserAmounts字典中直接获取对应金额:

<table class="table">
    <tr class="table-header">
        <th>Id</th>
        <th>TransId</th>
        @foreach (var user in Model.UserList)
        {
            <th>@user.Name</th>
        }
    </tr>
    @foreach (var item in Model.TransactionList)
    {
        <tr class="user-item" data-bs-toggle="modal" data-bs-target="#editUserModal">
            <td>@item.Id</td>
            <td>@item.TranId</td>

            @foreach (var user in Model.UserList)
            {
                <td>
                    @(item.UserAmounts.TryGetValue(user.Id, out var amount) && amount != null 
                        ? string.Format("{0:N2}", amount) 
                        : "N/A")
                </td>
            }
        </tr>
    }
</table>

效果验证

修改后,表格会正确显示每笔交易下各用户的金额:

  • TranId为1的交易行中,John列显示100.00,Jane列显示-100.00,完全符合你的数据预期。

内容的提问来源于stack exchange,提问作者allen.sophie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 08:52:50