在单个控制器中使用多个模型

本文关键字:模型 单个 控制器 | 更新日期: 2023-09-27 18:34:22

我已使用数据库中的 EF 设计器从为我的项目创建的数据库生成模型。对于单个控制器,我需要引用多个模型。这方面的一个例子是,有一个包含用户部门和办公室的用户表。我需要引用两个单独的表部门权限和办公室权限来确定用户能够看到哪些数据。

以下是自动生成的模型的示例:

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated from a template.
//
//     Manual changes to this file may cause unexpected behavior in your application.
//     Manual changes to this file will be overwritten if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace Project.Models
{
    using System;
    using System.Collections.Generic;
    public partial class User
    {
        public int User_ID { get; set; }
        public string User_Username { get; set; }
        public string User_Department { get; set; }
        public string User_Office { get; set; }
    }
}
//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated from a template.
//
//     Manual changes to this file may cause unexpected behavior in your application.
//     Manual changes to this file will be overwritten if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace Project.Models
{
    using System;
    using System.Collections.Generic;
    public partial class DepartmentPermission
    {
        public int DeptPerm_ID { get; set; }
        public string DeptPerm_Department { get; set; }
        public string DeptPerm_Role { get; set; }
    }
}
//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated from a template.
//
//     Manual changes to this file may cause unexpected behavior in your application.
//     Manual changes to this file will be overwritten if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace Project.Models
{
    using System;
    using System.Collections.Generic;
    public partial class OfficePermission
    {
        public string OffPerm_OfficeID { get; set; }
    }
}

每个表中的第一列是数据库中的主键。

使用任何这些自动生成的模型创建控制器时,除了我只能使用一个表之外,一切正常。

我希望能够从"用户"表中检查用户的部门和办公室,然后从"部门权限"表中检查

与用户部门关联的角色,然后检查用户的办公室是否在"Office权限"表中。

读到我可以构建一个视图模型来创建一个新模型,该模型结合了我要使用的模型,以便我可以从一个控制器中的所有相关表中获取信息。

我的示例视图模型是:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace Project.Models
{
    public class HomeViewModel
    {            
        public IEnumerable<User> Users { get; set; }
        public IEnumerable<OfficePermission> OfficePermissions { get; set; }
        public IEnumerable<DepartmentPermission> DepartmentPermissions { get; set; } 
    }
}

当我尝试使用此视图模型创建控制器时,出现错误,指出:

用户:

:实体类型"用户"未定义键。定义此实体类型的键。OfficePermission::实体类型"OfficePermission"未定义键。定义此实体类型的键。部门权限::实体类型"部门权限"未定义键。定义此实体类型的键。家庭视图模型::实体类型"家庭视图模型"未定义键。定义此实体类型的键。用户:实体类型:实体集"用户"基于未定义键的类型"用户"。OfficePermissions:EntityType:EntitySet 'OfficePermissions' 基于未定义键的类型 'OfficePermission'。部门权限:实体类型:实体集"部门权限"基于未定义键的类型"部门权限"。HomeViewModels: EntityType: EntitySet 'HomeViewModels' 基于未定义键的类型 "HomeViewModel"。

我可以在自动生成的文件中手动定义 Keys,但是当数据库更改并且文件需要自动重新生成时,这将被撤消。

有没有办法组合这些自动生成的模型,以便在控制器中一起使用它们?

在单个控制器中使用多个模型

您有不同的选项,可以使用其中任何一个

使用视图模型

对于视图模型,您必须创建一个类,在此类中,您将所有模型定义为此类的属性。这里有两类。

public class EmployeeDetails
{
    [Required]
    [Display(Name = "Name")]
    public string Name { get; set; }
}
public class Employee
{
    public int Id { get; set; }
}

这是视图模型

public class ViewModel
{
    public Employee emp { get; set; }
    public EmployeeDetails empdet{ get; set; }
}

现在在控制器中,您将这样做

public ActionResult About()
{
        ViewModel vm = new ViewModel();
        vm.emp = new Employee();
        vm.empdet = new EmployeeDetails();
        return View(vm);
}

鉴于你会像这样收到它

@model ViewModel

正如您所说,您正在获得错误表没有定义键,您应该正确定义表的键。

使用元组

元组用于存储不同的类型。您可以将所需的类对象存储在其中并传递给视图

在控制器中

Tuple<int, string> tuple = new Tuple<int, string>(1, "Hello world");
return View(tuple);

鉴于你会像这样收到它

@model Tuple<int,string>