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

ASP.NET Core MVC结合EF框架如何跨控制器传数据并在单视图展示多模型

解决方案

你遇到的问题主要来自三个错误点:

  1. TempData默认不支持直接存储自定义类对象,直接存入Customer实例会导致读取时为null
  2. InventoriesController的Index方法没有将组装好的组合模型传递给视图,而是直接返回了库存列表
  3. 视图绑定的模型类型错误,你声明的是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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 01:48:04