Куда должен идти код для построения моделей представления?

При построении модели представления в 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();
    }
}
5
задан Travis J 17 March 2012 в 00:16
поделиться