2015-04-22 145 views
1

我需要一個顯示員工姓名和員工關聯的主管姓名的視圖。ASP.NET MVC將多個模型傳遞給控制器​​查看

我有2個型號,他們如下:

public class Employee 
{ 
    public int EmployeeID { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Department { get; set; } 
    public int SupervisorID { get; set; } 

    public virtual ICollection<Supervisor> Supervisor { get; set; } 
} 

public class Supervisor 
{ 
    public int SupervisorID { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Phone { get; set; } 
    public string Email { get; set; } 
    public string Department { get; set; } 

    public virtual Employee Employee { get; set; } 
} 

要顯示所需要的數據我創造了另一種模式:

public class EmployeeSupervisor 
{ 
    public int EmployeeID { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Department { get; set; } 

    public string SupFirstName { get; set; } 
    public string SupLastName { get; set; } 
    public string SupPhone { get; set; } 
    public string SuoEmail { get; set; } 
    public string SupDepartment { get; set; } 
} 

,並在控制器的細節動作我做了以下:

Employee employee = db.Employees.Find(id); 
Supervisor supervisor = db.Supervisors.Find(employee.SupervisorID); 

EmployeeSupervisor es = new EmployeeSupervisor 
{ 
    EmployeeID = employee.EmployeeID, 
    Department = employee.Department, 
    FirstName = employee.FirstName, 
    LastName = employee.LastName, 
    SupFirstName = supervisor.FirstName, 
    SupLastName = supervisor.LastName, 
    SuoEmail = supervisor.Email, 
    SupPhone = supervisor.Phone, 
    SupDepartment = supervisor.Department 
}; 

return View(es); 

然後在視圖中我有

@model TimeOffV3.Models.EmployeeSupervisor 

然後最後我的視圖

@Html.DisplayFor(model => model.FirstName) 
@Html.DisplayFor(model => model.LastName) 
@Html.DisplayFor(model => model.SupFirstName) 
@Html.DisplayFor(model => model.SupLastName) 

當我完成如上述與EmployeeSupervisor模型類描述此任務之後,實體框架在數據庫中創建用於EmployeeSupervisor對應的表(如預期)。這導致我相信我做錯了,因爲我無法想象每次我想要顯示來自2個不同模型的數據時,我需要創建一個新的對應模型和表格。

我完成這個的方式正確嗎?我應該能夠使用Employee類中定義的導航屬性訪問管理員信息嗎?我可以傳遞多個模型,因此我不必創建包含來自2個獨立模型的信息的模型?

+0

對我來說,相似程度非常接近,我會製作一個員工模型,並在此模型中擁有一個自我引用的EmployeeID字段,該字段包含該員工的主管的ID。 – JonH

回答

3

事實上,視圖只能獲得一個模型,但該模型不一定是平坦的。您的視圖模型可能包含不同的屬性的實體

public class EmployeeSupervisor 
{ 
    public Employee Employee { get; set; } 
    public Supervisor Supervisor{ get; set; } 
} 

而且在你看來,你與他們合作爲以下的每一個:

@Html.DisplayFor(model => model.Employee.FirstName) 
    @Html.DisplayFor(model => model.Employee.LastName) 
    @Html.DisplayFor(model => model.Supervisor.FirstName) 
    @Html.DisplayFor(model => model.Supervisor.LastName) 

,你應該知道的其他事情,是觀唐」不得不與實體(那些在數據庫中有相應表格的實體)一起工作。您可以創建一個只包含視圖中使用的屬性的ViewModels。有一些庫,可以幫助你的ViewModels和實體之間的映射,例如AutomapperValueInjecter

舉例來說,如果你需要在視圖中顯示只有員工和主管的視圖模型的全名可能看起來像:

public class EmployeeSupervisorViewModel 
{ 
    public string EmployeeName { get; set; } 
    public string SupervisorName { get; set; } 
} 

而且控制器:

Employee employee = db.Employees.Find(id); 
    Supervisor supervisor = db.Supervisors.Find(employee.SupervisorID); 

    var model = new EmployeeSupervisorViewModel 
    { 
     EmployeeName = string.Format("{0} {1}",employee.FirstName, employee.LastName), 
     SupervisorName = string.Format("{0} {1}",supervisor.FirstName, supervisor.LastName), 
    }; 

    return View(model); 

EmployeeSupervisorViewModel不是一個實體,不應該有一個數據庫表它只用於在視圖/控制器水平和含有隻有通過查看

0

創建一個視圖模型類,將僱員和主管對象包裝爲屬性。在EF模型之外做這件事。

將實例傳遞給您的視圖,通過EF填充屬性並訪問屬性以獲取值。

2

調查ViewModels

你有正確的想法,但問題是你不應該使用該視圖模型創建另一個表。

確保您的EmployeeSupervisor類不在您的實體框架內,這個類嚴格意義上顯示與視圖對應的數據。

1

要回答你的問題

(要呈現到客戶端信息)所需的信息是我完成了這一正確的方法是什麼?

不,您要查找的是查看模型。雷切爾阿佩爾有一個很好的職位,我強烈建議你閱讀 - Use ViewModels to manage data & organize code in ASP.NET MVC applications

什麼是查看模型?

的ViewModels允許您從一個或多個數據模型(在你的情況下,這是員工和主管人員)或來源塑造多個實體整合到一個對象,由視圖消費和渲染優化。 - Rachel Appel

換句話說,它只是另一個簡單的類,就像Employee和Supervisor通常被稱爲POCO

public class EmployeeSupervisorViewModel 
{ 
    public int EmployeeId { get; set; } 
    public string Department { get; set; } 
    public string FristName { get; set; } 
    public string LastName { get; set; } 
    public string SupFirstName { get; set; } 
    public string SupLastName { get; set; } 
    public string SupEmail { get; set; } 
    public string SupPhone { get; set; } 
} 

這允許你做下面你Controller

 var employee = _db.Employee.Find(id); 
     var supervisor = _db.Supervisor.Find(employee.SupervisorID); 

     var model = new EmployeeSupervisorViewModel() 
     { 
      EmployeeId = employee.EmployeeId, 
      Department = employee.Department, 
      FristName = employee.FirstName, 
      LastName = employee.LastName, 
      SupFirstName = supervisor.FirstName, 
      SupLastName = supervisor.LastName, 
      SupEmail = supervisor.Email, 
      SupPhone = supervisor.Phone 
     }; 
     return View(model); 

在你看來簡單地接受視圖模型,EmployeeSupervisorViewModel,作爲模型和之前對其進行操作。

@model TimeOffV3.Models.EmployeeSupervisorViewModel 

從長遠來看,對於較大的視圖模型,這種映射可能會有些乏味。這是AutoMapper派上用場的地方。

最後,我還建議閱讀這個post from Jimmy Bogard (How we do MVC – View models)它有如何做視圖模型,如有1:1的視圖和視圖模型和更多的映射真的很好的觀點。

相關問題