Quando si crea un modello di vista in MVC3 di asp.net, dove dovrebbe andare il codice per creare un'istanza degli oggetti di quel modello di vista? Lo sto facendo principalmente nel controller in questo momento, a parte il codice per interrogare il database. Ecco un esempio in codice:Dove dovrebbe andare il codice per costruire i modelli di visualizzazione?
Vista Modello:
public class WorkListVM
{
//list for employees
[Display(Name = "Select A Employee")]
[Required]
public int? EmployeeId { get; set; }
public GenericSelectList EmployeeList { get; set; }
}
Codice Controller:
//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);
}
Generico Select List è una semplice classe per contenere i dati che va nella aiutante @html.dropdownfor
's SelectList
. Costruisco queste liste di selezione e creo anche configurazioni di dati simili per i modelli di visualizzazione all'interno del codice del controller. Il controller che ospita questo codice ha un totale di 109 linee di codice, quindi non è enorme o fuori controllo. Tuttavia, cerco sempre di ridurre la ridondanza e talvolta il codice in //build employee list
finisce per essere incollato sulla copia (ugh, odio il copia incolla) in altri controller.
C'è un posto migliore per avere questo codice? Dovrei forse usare lo schema di fabbrica per costruire i dati per queste liste di selezione/altri oggetti di dati di visualizzazione?
EDIT
Grazie per tutto il vostro aiuto. Ecco cosa ho finito per fare. Ho finito per fare un metodo all'interno della classe lista di selezione generica molto simile al .ToSelectList (...) suggerito da Richard e 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();
}
}
Se si restituisce il tuo viewmodel a una vista, quindi il codice va nel controller. –
@ 白 ジ ェ ー ム ス - Sì, alla fine di questo metodo actionresult è 'return View (vm);'. La vista è fortemente scritta '@model WorkListVM'. Alcuni di questo codice sono usati più volte (in diversi controller). Non avrebbe senso avere una fabbrica che avvolge la creazione di questi oggetti viewmodel al fine di ridurre la ridondanza? –