在实体框架下如何在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>
现在你能提供我犯错误的地方吗?
查看您在问题中提供的链接,目的是创建一个始终相同的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
类中声明属性Employee
和Department
的原因。
因此,在每个动作中,你都需要输入:
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();
}
}