При построении модели представления в MVC3 asp.net, где должен код переходит к созданию экземпляра объекта ects этой модели представления? Сейчас я делаю это в основном в контроллере, кроме кода для запроса базы данных. Вот пример в коде:
Модель представления:
public class WorkListVM
{
//list for employees
[Display(Name = "Select A Employee")]
[Required]
public int? EmployeeId { get; set; }
public GenericSelectList EmployeeList { get; set; }
}
Код контроллера:
//build view model
var vm = new WorkListVM();
//build employee list
vm.EmployeeList = new GenericSelectList(0,"-- Select Employee --");
var employees = new List<Employee>();
using (var gr = new GenericRepo<Employee>())
{
employees = gr.Get().ToList();
}
foreach(var employee in employees)
{
var gl = new GenericListItem();
gl.Id = employee.EmployeeId;
gl.DisplayFields = employee.FirstName + " " + employee.LastName;
vm.EmployeeList.Values.Add(gl);
}
Общий список выбора — это простой класс для хранения данных, которые идут в помощнике @html.dropdownfor
. СписокВыбрать
.Я создаю эти списки выбора, а также создаю аналогичные конфигурации данных для моделей представлений внутри кода контроллера. Контроллер, на котором размещен этот код, имеет в общей сложности 109 строк кода, поэтому он не слишком велик и не выходит из-под контроля. Тем не менее, я всегда стремился уменьшить избыточность, и иногда код в //построение списка сотрудников
в конечном итоге копировался (тьфу, я ненавижу копировать и вставлять) в другие контроллеры.
Есть ли лучшее место для хранения этого кода? Должен ли я использовать фабричный шаблон для создания данных для этих списков выбора/других объектов данных представления?
РЕДАКТИРОВАТЬ
Спасибо за вашу помощь. Вот что я в итоге сделал. В итоге я создал метод внутри общего класса списка выбора, очень похожий на .ToSelectList(...), предложенный Ричардом и Джесси:
public class GenericSelectList
{
public List<GenericListItem> Values { get; set; }
public int StartValue { get; set; }
public string Message { get; set; }
public GenericSelectList(int StartValue = 0, string Message = "select")
{
Values = new List<GenericListItem>();
this.StartValue = StartValue;
this.Message = Message;
}
public void BuildValues<T>(List<T> items, Func<T, int> value, Func<T, string> text) where T : class
{
this.Values = items.Select(f => new GenericListItem()
{
Id = value(f),
DisplayFields = text(f)
}).ToList();
}
}