如何在关联用户列的表格中正确展示交易金额?
问题分析与解决方案
核心问题
- 控制器逻辑错误:你在嵌套循环中每次都会覆盖
transaction的UserId和Amount属性,最终每个交易对象只会保留最后一个匹配用户的金额,其他用户的关联信息被完全覆盖丢失。 - 视图查询逻辑错误:视图中仅通过
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
相关产品推荐
相关产品推荐

