пятница, 28 августа 2009 г.

ASP.NET MVC: DropDownList

При редактировании некоторых полей объекта очень часто необходимо использование контрола DropDownList. А чтоб его заполнить данными нужен объект типа IEnumerable.

Для примера понадобятся слудующие сущности EmployeeEntity, JobEntity

public class EmployeeEntity
  {
    public virtual int EmployeeId { get; set;}
    public virtual string FirstName { get; set; }
    public virtual string LastName { get; set; }
    public virtual String JobId { get; set; }
  }


* This source code was highlighted with Source Code Highlighter.


public class JobEntity
  {
    public virtual string JobId { get; set; }
    public virtual string JobTitle { get; set; }
  }


* This source code was highlighted with Source Code Highlighter.


Что бы удобно передать во View модель данных содержащую как экземпляр Employee так и список Job`ов создаем класс обертку:
public class EmployeeEditViewData
  {
    public EmployeeEntity Employee;
    public IEnumerable<SelectListItem> Jobs;
  }


* This source code was highlighted with Source Code Highlighter.


Теперь необходимо создать Action для Employee контроллера
  1. public ActionResult Edit(int id)
  2.     {
  3.       EmployeeEntity employeeEntity = _employeeRepository.EditById(id);
  4.       IEnumerable<SelectListItem> jobs =
  5.         Domain
  6.         .CurrentSession
  7.         .CreateCriteria<Job>()
  8.         .List<Job>()
  9.         .Select(j => new SelectListItem
  10.                  {
  11.                    Text = j.JobTitle,
  12.                    Value = j.JobId,
  13.                    Selected = employeeEntity.JobId == j.JobId
  14.                  });
  15.  
  16.       EmployeeEditViewData viewData = new EmployeeEditViewData
  17.                         {
  18.                           Employee = employeeEntity,
  19.                           Jobs = jobs
  20.                         };
  21.       return View("Edit", viewData);
  22.     }
* This source code was highlighted with Source Code Highlighter.

А теперь по порядку:
строка 3 - получение экземляра объекта EmployeeEntity;
строки 4-14 - получение экземляра IEnumerable Jobs;
строки 16-20 - создаем EmployeeEditViewData и инициализируем поля ранее получеными объектами;

Для данного action необходимо создать строго типизированную view на основе класса EmployeeEditViewData. У меня студийный генератор не смог сгенерить заготовку view для редактирования полей, но ничего не мешает это сделать самому.
Для поля в котором нам понадобится DropDownList пишем следующий код:
    <p>
      <label for="JobId">
        Job:</label>     
      <%= Html.DropDownList("JobId",Model.Jobs) %>      
    </p>


* This source code was highlighted with Source Code Highlighter.


В общем то все.

Комментариев нет: