将多个模型传递给 ASP.NET MVC 中的视图

Posted

技术标签:

【中文标题】将多个模型传递给 ASP.NET MVC 中的视图【英文标题】:Passing more than one model to the view in ASP.NET MVC 【发布时间】:2019-01-10 11:26:12 【问题描述】:

我需要在同一个视图中传递两个模型,但是有些元素具有相同的名称。

我有两个模型EmployeeHolidayRequestForm,我需要在一个视图中使用这两个模型,这将是每个员工的详细信息页面。

这是我的Employee

public partial class Employee
 
    public int EmployeeID  get; set; 
    public string FullName  get; set; 
    public string EmailID  get; set; 
    public string Password  get; set; 
    public System.DateTime StartDate  get; set; 
    public int RoleID  get; set; 
    public int ShiftID  get; set; 
    public int AreaID  get; set; 
    public int DisciplineID  get; set; 
    public int SiteID  get; set; 
    public int ALCategory  get; set; 
    public Nullable<int> HoursTaken  get; set; 
    public Nullable<int> AwardedLeave  get; set; 
    public Nullable<int> TotalHoursThisYear  get; set; 
    public int HoursCarriedForward  get; set; 
    public Nullable<int> EntitlementRemainingThisYear  get; set; 
    public string Comments  get; set; 

   

这是我的HolidayRequestForm

public partial class HolidayRequestForm

    public int RequestID  get; set; 
    public int EmployeeID  get; set; 
    public System.DateTime StartDate  get; set; 
    public System.DateTime FinishDate  get; set; 
    public int HoursTaken  get; set; 
    public string Comments  get; set; 
    public int YearCreated  get; set; 
    public int MonthCreated  get; set; 
    public Nullable<int> DayCreated  get; set; 
    public Nullable<int> YearOfHoliday  get; set; 


我尝试创建一个单独的模型,其中包含要在视图中使用的所有元素,但我不确定如何区分具有相同名称的元素,例如。评论 甚至可以这样做吗?

我想在我的视图中使用这两个模型,因为我想创建一个员工资料页面,他们的信息在顶部显示有关他们的个人资料的信息,然后是他们在表格中使用 holidayrequestform 请求的假期页面底部。

【问题讨论】:

【参考方案1】:

编写一个ViewModel,其中包含EmployeeHolidayRequestForm,如下所示,然后将ViewModel 传递给视图:

public class EmployeeViewModel

    public Employee Employee get; set;

    public HolidayRequestForm HolidayRequestForm get; set;

然后在你的操作方法中:

public ActionResult EmployeeDetails(int id)

     Employee employee =  _dbContext.Employees.FirstOrDefault(emp => emp.EmployeeID == id);
     HolidayRequestForm holidayRequestForm =  _dbContext.HolidayRequestForms.FirstOrDefault(hrf => hrf.EmployeeID == id);

     EmployeeViewModel employeeViewModel = new EmployeeViewModel()
     
        Employee = employee,
        HolidayRequestForm  = holidayRequestForm
     

     return View(employeeViewModel);

然后在视图中,访问模型属性如下:

@model EmployeeViewModel

<p>Full Name: @Model.Employee.FullName</p>

【讨论】:

我应该如何将模型绑定到视图?会不会像 @model LotusWorksHT.Models.EmployeeViewModel LotusWorksHT 一样是项目的名称。 是的!它应该是完全限定的命名空间!如果您的EmployeeViewModel 位于LotusWorksHT 项目的Models 文件夹中,那么它应该是@model LotusWorksHT.Models.EmployeeViewModel,如您所说。 嗯,当我使用 Full Name: @Model.Employee.FullName 时,我得到一个空异常。但后来我尝试了@html.DisplayNameFor(model =&gt; model.Employee.FullName) 并没有显示任何数据。我怀疑数据没有被传递到视图中?还是它弄乱了模型?感谢所有的帮助,无论如何它让我开始了。 @Conor8630 这意味着EmployeeViewModel 中的Employee 为空!在方法中调试以确保它是否从数据库中提取Employee 数据。 让我们continue this discussion in chat。

以上是关于将多个模型传递给 ASP.NET MVC 中的视图的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC 视图需要将选定的下拉列表和日历日期传递给模型

ASP.NET MVC & C#:将视图模型传递给控制器

如何将项目列表从视图传递到控制器(ASP.NET MVC 4)

如何将两个模型组合成一个模型并使用 asp.net MVC razor 将其传递给查看

将多个参数从 ajax post 传递到 asp.net mvc 控制器

ASP.NET MVC - 使用 C# 将引用不同程序集的模型从控制器传递到视图