2015-04-22 4 views
1

Мне нужно иметь представление, в котором отображаются имя сотрудника и фамилия сотрудника и связанного с ним сотрудника.ASP.NET MVC Pass Несколько моделей для просмотра с контроллера

У меня есть 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 в базе данных (как ожидается). Это заставляет меня думать, что я делаю это неправильно, поскольку я не могу себе представить, что каждый раз, когда я хочу отображать данные из двух разных моделей, мне нужно создать новую соответствующую модель и таблицу.

Как я это сделал? Должен ли я иметь доступ к информации супервизора с использованием свойства навигации, определенного в классе Employee? Могу ли я передавать несколько моделей, поэтому мне не нужно создавать модель, содержащую информацию из двух отдельных моделей?

+0

Для меня сходства настолько близки, что я сделал бы модель сотрудника и имел самонаводящее поле EmployeeID в этой модели, которое взяло идентификатор руководителя сотрудника. – 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) 

Дополнительной вещи, которую вы должны знать, что просмотры Дон» t должны работать с объектами (те, которые имеют соответствующие таблицы в базе данных). Вы можете создать ViewModels, который будет содержать только те свойства, которые используются в вашем представлении.Есть некоторые библиотеки, которые могут помочь вам с отображением между ViewModels и организациями, например Automapper или ValueInjecter

Если, например, вам нужно отобразить на ваш взгляд, только полные имена сотрудников и руководителя вашей модели представления может выглядеть следующим образом:

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 не является сущностью и не должны иметь таблицу базы данных Он используется только на уровне View/Controller и содержит только информация, которая требуется View (информация, которую вы хотите оказать клиенту)

0

Создайте класс модели представления, который обертывает объекты employee и supervisor как свойства. Сделайте это за пределами своей модели EF.

Передайте экземпляр вашему представлению, заполнив свойства через EF и получив доступ к свойствам для получения значений.

2

Посмотрите на ViewModels.

У вас есть правильная идея, но проблема в том, что вы не должны создавать другую таблицу с этой моделью просмотра.

Убедитесь, что ваш класс EmployeeSupervisor находится за пределами вашего объекта Entity Framework, этот класс строго предназначен для отображения данных, соответствующих представлению.

1

Чтобы ответить на ваш вопрос

ли способ, которым я совершил это правильно?

Нет, все, что вы ищете, это модели. Рэйчел Аппель имеет отличную должность в связи с этим, которую я настоятельно рекомендую вам прочитать - Use ViewModels to manage data & organize code in ASP.NET MVC applications.

Что такое модели?

ViewModels позволяет формировать несколько объектов из одной или нескольких моделей данных (в вашем случае это будет Employee и супервизор) или источников в единый объект, оптимизированный для потребления и рендеринга в виде. - Rachel Appel

Другими словами, это просто еще один простой класс, такой как Employee and 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); 

На ваш взгляд просто принять View Model, EmployeeSupervisorViewModel, как модель и работать на нем, как и прежде.

@model TimeOffV3.Models.EmployeeSupervisorViewModel 

В конечном счете это сопоставление может быть немного утомительным при использовании больших моделей. Здесь AutoMapper пригодится.

Наконец, я также рекомендую прочитать это post from Jimmy Bogard (How we do MVC – View models). У него есть некоторые действительно хорошие моменты о том, как это сделать. Модели, такие как отображение 1: 1 модели просмотра и просмотра и многое другое.

Смежные вопросы