在实体框架下如何在mvc中传递模型数据到布局页面

本文关键字:数据 模型 布局 框架 实体 mvc | 更新日期: 2023-09-27 18:16:34

我遇到了一个问题,我想在布局页面上显示模型的属性。参考这个答案,我尝试按照以下方式实现模型

CompanyProfile模型
[Table("tblCompany")]
    public abstract class CompanyProfile
    {
        [Key]
        public int CompanyId { get; set; }
        public string CompanyName { get; set; }
        public string CompanyLogo { get; set; }
        public string TitlePic { get; set; }
        public string CopyText { get; set; }
        public string RegText { get; set; }
    }

员工模型像

[Table("tblEmployee")]
    public class Employee:CompanyProfile
    {
        [Key]
        public int EmpID { get; set; }
        public string Name { get; set; }
        public string Gender { get; set; }
        public int DepartmentId { get; set; }
        public string EmpNo { get; set; }
    }

部门模型如下

[Table("tblDepartment")]
    public class Department:CompanyProfile
    {
        [Key]
        public int DeptID { get; set; }
        public string DeptName { get; set; }
    }

可以看到这两个模型都继承自

CompanyProfile

模型。现在我的问题是,当我试图访问公司配置文件模型在我的控制器它给我一个错误

"列名'CompanyId'无效。'r'无效列名'CompanyId'"

因为实体框架正在代表模型创建表并连接这些表,并试图找到

CompanyId in the employee

就我所知。

SampleContext类类似于

public class SampleContext:DbContext
    {
        public DbSet<Employee> empList { get; set; }
        public DbSet<Department> deptList { get; set; }
        public DbSet<CompanyProfile> Profile { get; set; }
    }

而HomeController就像

SampleContext context=new SampleContext();
        public ActionResult Index()
        {
            CompanyProfile profile;
            if (Session["Profile"] == null)
            {
                Session["Profile"] = context.Profile.FirstOrDefault();
            }
            profile = (CompanyProfile)Session["Profile"];
            return View(profile);
        }

这是我的布局。cshtml代码

 @model ShareLayoutToContent.Models.CompanyProfile
<head>
    <meta name="viewport" content="width=device-width" />
    <title>@ViewBag.Title</title>
    <link rel="shortcut icon" href="@Url.Content(Model.TitlePic)">
</head>

现在你能提供我犯错误的地方吗?

在实体框架下如何在mvc中传递模型数据到布局页面

查看您在问题中提供的链接,目的是创建一个始终相同的main模型,例如:

public class BaseModel
{
    public CompanyProfile Profile { get; set; }
    public Employee Employee { get; set; }
    public Department Department { get; set; }
}

所以你的实体应该是:

[Table("tblCompany")]
public class CompanyProfile
{
    [Key]
    public int CompanyId { get; set; }
    public string CompanyName { get; set; }
    public string CompanyLogo { get; set; }
    public string TitlePic { get; set; }
    public string CopyText { get; set; }
    public string RegText { get; set; }
}
[Table("tblEmployee")]
public class Employee
{
    [Key]
    public int EmpID { get; set; }
    public string Name { get; set; }
    public string Gender { get; set; }
    public int DepartmentId { get; set; }
    public string EmpNo { get; set; }
    public CompanyProfile profile { get; set; } //if needed
}
[Table("tblDepartment")]
public class Department
{
    [Key]
    public int DeptID { get; set; }
    public string DeptName { get; set; }
    public CompanyProfile profile { get; set; } //if needed
}

然后你就可以基于BaseModel创建你的MainView

HomeController:

SampleContext context=new SampleContext();
public ActionResult Index()
{
    CompanyProfile profile;
    if (Session["Profile"] == null)
    {
       Session["Profile"] = context.Profile.FirstOrDefault();
    }
    profile = (CompanyProfile)Session["Profile"];
    return View(new BaseModel { Profile = profile });
}

视图或MainLayout:

@model ShareLayoutToContent.Models.BaseModel
<head>
    <meta name="viewport" content="width=device-width" />
    <title>@ViewBag.Title</title>
    <link rel="shortcut icon" href="@Url.Content(Model.Profile.TitlePic)">
</head>

@Model将包含BaseModel的对象,因此您放入该对象中的所有内容将在主布局以及视图中可用。您只需要始终返回基于BaseModel的视图。这就是我在BaseModel类中声明属性EmployeeDepartment的原因。
因此,在每个动作中,你都需要输入:

return View(new BaseModel { /*property's you need */ });

我宁愿建议您将CompanyProfile放在ViewBag中,而忘记BaseModel然后你可以保留原始的视图模型,并在过程中放置"几乎静态"的值,这些值可以在Controller的构造函数中调用。

public class HomeController : Controller
{
    SampleContext context=new SampleContext();
    public HomeController()
    {
        ViewBag.CompanyProfile = context.Profile.FirstOrDefault();      
    }
    public ActionResult Index()
    {
        return View();
    }
}