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

ASP.NET Core MVC视图如何同时返回多个模型数据?

解决ASP.NET Core MVC同时展示两个模型复选框列表的问题

你报错的核心原因是ASP.NET MVC的View()方法仅支持传入单个模型对象,你写的return View(m1, m2)不符合方法签名,导致运行报错。下面是两种可行的解决方法,推荐使用第一种类型安全的方案:


方案一:创建复合视图模型(推荐)

这种方式符合MVC设计规范,具备类型检查,便于后期维护。

1. 定义复合视图模型

新建一个包含两个子模型的视图模型类:

public class CombinedViewModel
{
    public StudentCourseViewModel CihazlarList { get; set; }
    public StudentCourseViewModel HardwareSoftwareList { get; set; }
}

2. 修改Controller的Create方法

将两个数据源的数据赋值到复合模型的对应属性中:

public IActionResult Create()
{
    // 处理第一个数据源:Cihazlar
    var cihazlarItems = _context.Cihazlar.ToList();
    var cihazlarVm = new StudentCourseViewModel();
    cihazlarVm.AvailableCourses = cihazlarItems.Select(vm => new CheckBoxItem()
    {
        Id = vm.Id,
        Title = vm.Model,
        IsChecked = false
    }).ToList();

    // 处理第二个数据源:HardwareSoftware
    var hardwareItems = _context.HardwareSoftware.ToList();
    var hardwareVm = new StudentCourseViewModel();
    hardwareVm.AvailableCourses2 = hardwareItems.Select(vm => new CheckBoxItem()
    {
        Id = vm.Hardware_Software_Id,
        Title = vm.Hardware_Software_Name,
        IsChecked = false
    }).ToList();

    // 实例化复合模型并传入视图
    var combinedModel = new CombinedViewModel()
    {
        CihazlarList = cihazlarVm,
        HardwareSoftwareList = hardwareVm
    };

    return View(combinedModel);
}

3. 修改视图绑定与渲染

在Create视图顶部指定复合模型类型,然后分别渲染两个复选框列表:

@model YourProjectNamespace.CombinedViewModel

<!-- 渲染Cihazlar复选框列表 -->
<h3>Cihazlar 选项</h3>
@foreach (var item in Model.CihazlarList.AvailableCourses)
{
    <div class="checkbox-item">
        <input type="checkbox" id="cihaz_@item.Id" name="CihazlarSelected" value="@item.Id" />
        <label for="cihaz_@item.Id">@item.Title</label>
    </div>
}

<!-- 渲染HardwareSoftware复选框列表 -->
<h3>HardwareSoftware 选项</h3>
@foreach (var item in Model.HardwareSoftwareList.AvailableCourses2)
{
    <div class="checkbox-item">
        <input type="checkbox" id="hw_@item.Id" name="HardwareSelected" value="@item.Id" />
        <label for="hw_@item.Id">@item.Title</label>
    </div>
}

方案二:使用ViewBag临时传递数据(快速临时方案)

如果不想创建新模型,可以用ViewBag传递第二个模型,但这种方式没有类型检查,长期维护成本高:

1. 修改Controller代码

public IActionResult Create()
{
    // 处理第一个模型m1(原有代码不变)
    var item = _context.Cihazlar.ToList();
    StudentCourseViewModel m1 = new StudentCourseViewModel();
    m1.AvailableCourses = item.Select(vm => new CheckBoxItem()
    {
        Id = vm.Id,
        Title = vm.Model,
        IsChecked = false
    }).ToList();

    // 处理第二个模型m2并放入ViewBag
    var item2 = _context.HardwareSoftware.ToList();
    StudentCourseViewModel m2 = new StudentCourseViewModel();            
    m2.AvailableCourses2 = item2.Select(vm => new CheckBoxItem()
    {
        Id = vm.Hardware_Software_Id,
        Title = vm.Hardware_Software_Name,
        IsChecked = false
    }).ToList();
    ViewBag.HardwareVm = m2;

    return View(m1);
}

2. 修改视图代码

@model YourProjectNamespace.StudentCourseViewModel

<!-- 渲染m1的复选框列表(原有代码不变) -->
<h3>Cihazlar 选项</h3>
@foreach (var item in Model.AvailableCourses)
{
    <div class="checkbox-item">
        <input type="checkbox" id="cihaz_@item.Id" name="CihazlarSelected" value="@item.Id" />
        <label for="cihaz_@item.Id">@item.Title</label>
    </div>
}

<!-- 渲染ViewBag中的m2列表 -->
<h3>HardwareSoftware 选项</h3>
@{
    var hardwareVm = ViewBag.HardwareVm as YourProjectNamespace.StudentCourseViewModel;
    if (hardwareVm != null)
    {
        foreach (var item in hardwareVm.AvailableCourses2)
        {
            <div class="checkbox-item">
                <input type="checkbox" id="hw_@item.Id" name="HardwareSelected" value="@item.Id" />
                <label for="hw_@item.Id">@item.Title</label>
            </div>
        }
    }
}

内容的提问来源于stack exchange,提问作者mondros

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 16:06:25