Al construir un modelo de vista en el MVC3 de asp.net, ¿dónde debería ir el código para crear una instancia de los objetos de ese modelo de vista? Lo estoy haciendo principalmente en el controlador en este momento, aparte del código para consultar la base de datos. Aquí es un ejemplo en el código:¿A dónde debería ir el código para construir modelos de vista?
Ver Modelo:
public class WorkListVM
{
//list for employees
[Display(Name = "Select A Employee")]
[Required]
public int? EmployeeId { get; set; }
public GenericSelectList EmployeeList { get; set; }
}
Código de control:
//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);
}
Genérico lista de selección es una clase simple para contener los datos que va en el ayudante @html.dropdownfor
's SelectList
. Construyo estas listas de selección y también construyo configuraciones de datos similares para ver modelos dentro del código del controlador. El controlador que aloja este código tiene un total de 109 líneas de código, por lo que no es enorme ni está fuera de control. Sin embargo, siempre me esfuerzo por reducir la redundancia y, a veces, el código en //build employee list
termina siendo copiado (uf, odio copiar y pegar) en otros controladores.
¿Hay un lugar mejor para tener este código? ¿Debería estar usando el patrón de fábrica para construir los datos para estas listas de selección/otros objetos de datos de visualización?
EDITAR
Gracias por toda su ayuda. Esto es lo que terminé haciendo. Acabé por hacer un método dentro de la clase selecta lista genérica muy similar a la .ToSelectList (...) sugerido por Richard y Jesse:
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();
}
}
Si devuelve su viewmodel a una vista, entonces el código entra en el controlador. –
@ 白 ジ ェ ス ス ス - Sí, al final de este método actionresult es 'return View (vm);'. La vista está fuertemente tipeada '@model WorkListVM'. Parte de este código se usa varias veces (en diferentes controladores). ¿No tendría sentido tener una fábrica que envuelva la creación de estos objetos de viewmodel para reducir la redundancia? –