ASP.NET Core MVC结合EF框架如何跨控制器传数据并在单视图展示多模型
解决方案
你遇到的问题主要来自三个错误点:
- TempData默认不支持直接存储自定义类对象,直接存入
Customer实例会导致读取时为null InventoriesController的Index方法没有将组装好的组合模型传递给视图,而是直接返回了库存列表- 视图绑定的模型类型错误,你声明的是
IEnumerable<CustomerInventoryCollectionDataModel>集合,但实际只需要单个组合模型实例
推荐采用更稳妥的「传客户ID重新查询」方案实现,避免TempData序列化问题,同时保证数据一致性:
步骤1:修改Customers控制器的跳转方法
仅传递客户ID,避免复杂对象序列化问题:
public async Task<IActionResult> passToInventory(int? id) { if (id == null) { return NotFound(); } TempData["custId"] = id; // 若需要支持页面刷新后仍保留客户信息,添加Keep方法 TempData.Keep("custId"); return RedirectToAction("Index", "Inventories"); }
步骤2:修改Inventories控制器的Index方法
组装你定义的组合模型再传递给视图:
public async Task<IActionResult> Index() { var viewModel = new CustomerInventoryCollectionDataModel(); // 读取客户ID并查询客户信息 if (TempData["custId"] is int custId) { viewModel.CustomerData = await _context.Customers.FindAsync(custId); TempData.Keep("custId"); } // 查询库存列表 viewModel.Inventorys = await _context.Inventories.ToListAsync(); // 传递组合模型到视图 return View(viewModel); }
步骤3:修正Inventory的Index视图代码
修改模型绑定,分别渲染客户信息和库存列表:
@* 绑定单个组合模型,而非集合 *@ @model JAXSurplusMouseApp.Models.CustomerInventoryCollectionDataModel <!-- 顶部展示选中客户信息 --> @if (Model.CustomerData != null) { <div style="padding:15px;border:1px solid #eee;margin-bottom:20px;"> <h4>已选中客户</h4> <p>客户ID:@Model.CustomerData.CustomerId</p> <p>客户名称:@Model.CustomerData.CustomerName</p> <!-- 按需添加其他需要展示的客户字段 --> </div> } <!-- 下方库存列表 --> <table class="table"> <thead> <tr> <th>可用数量</th> <!-- 其他库存表头字段 --> </tr> </thead> <tbody> @foreach (var inventory in Model.Inventorys) { <tr> <td>@inventory.QuantityAvailable</td> <!-- 其他库存字段 --> </tr> } </tbody> </table>
如果你坚持要直接在TempData中存储整个Customer对象,需要手动做序列化处理:
- 存储时:
TempData["custdata"] = System.Text.Json.JsonSerializer.Serialize(customer_data); - 读取时:
viewModel.CustomerData = System.Text.Json.JsonSerializer.Deserialize<Customer>(TempData["custdata"]?.ToString());
内容的提问来源于stack exchange,提问作者trx
相关产品推荐
相关产品推荐

