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

Razor Pages实现两表联查展示,是否需创建第三模型?

解决方案:创建视图模型(ViewModel)来展示关联数据

你不需要在局部视图里同时调用两个现有模型,最佳实践是创建一个专门的视图模型,用来封装你需要展示的所有字段,原因如下:

  • Razor Pages的局部视图只能绑定一个强类型模型,无法直接同时接收Employee和Department两个独立实体类。
  • 用ViewBag/ViewData传递额外数据虽然可行,但属于弱类型操作,没有编译时检查,后期维护容易出问题。

具体实现步骤:

  1. 创建视图模型类
    新建一个类(比如命名为EmployeeDepartmentViewModel),包含你查询需要展示的字段:
public class EmployeeDepartmentViewModel
{
    public string DepartmentName { get; set; }
    public string EmployeeName { get; set; }
    public DateTime DateofJoining { get; set; }
}
  1. 修改后台查询逻辑(Index PageModel)
    在搜索的Post方法中,通过LINQ实现内联查询,并将结果映射到视图模型:
private readonly CompanyContext _context;

public IndexModel(CompanyContext context)
{
    _context = context;
}

public IActionResult OnPostSearch(int departmentId)
{
    var searchResults = _context.Employees
        .Join(
            _context.Departments,
            employee => employee.DepartmentID,
            department => department.DepartmentID,
            (employee, department) => new EmployeeDepartmentViewModel
            {
                DepartmentName = department.DepartmentName,
                EmployeeName = employee.EmployeeName,
                DateofJoining = employee.DateofJoining
            }
        )
        .Where(x => x.DepartmentID == departmentId) // 若视图模型添加了DepartmentID字段,直接用此过滤;否则可在Join时捕获department对象进行过滤
        .ToList();

    return Partial("_DisplaySearchPartial", searchResults);
}
  1. 更新局部视图_DisplaySearchPartial.cshtml
    将局部视图的模型声明改为视图模型的集合,然后渲染表格:
@model IEnumerable<EmployeeDepartmentViewModel>

<table class="table">
    <thead>
        <tr>
            <th>部门名称</th>
            <th>员工姓名</th>
            <th>入职日期</th>
        </tr>
    </thead>
    <tbody>
        @foreach (var item in Model)
        {
            <tr>
                <td>@item.DepartmentName</td>
                <td>@item.EmployeeName</td>
                <td>@item.DateofJoining.ToString("yyyy-MM-dd")</td>
            </tr>
        }
    </tbody>
</table>

不推荐的替代方案(仅作参考)

如果暂时不想创建新模型,也可以使用匿名类型配合dynamic模型,但这种方式没有类型检查,容易引发运行时错误:

  • 后台查询返回匿名类型集合,局部视图声明@model IEnumerable<dynamic>
  • 渲染时直接通过@item.DepartmentName取值,但编译时不会校验字段是否存在,后期修改实体类时容易出错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 04:25:16