Per coloro che creano ViewModels (per l'uso da viste digitate) in ASP.NET MVC, si preferisce recuperare i dati da un servizio/repository dal ViewModel o dalle classi controller?Recupero di dati all'interno di una classe ViewModel di ASP.NET MVC?
Per esempio, abbiamo iniziato avendo ViewModels essenzialmente essere DTOs e consentendo ai nostri controllori per recuperare i dati (ad esempio grossolanamente semplificato presuppone che l'utente può cambiare solo nome del dipendente):
public class EmployeeViewModel
{
public String Name; //posted back
public int Num; //posted back
public IEnumerable<Dependent> Dependents; //static
public IEnumerable<Spouse> Spouses; //static
}
public class EmployeeController()
{
...
public ActionResult Employee(int empNum)
{
Models.EmployeeViewModel model = new Models.EmployeeViewModel();
model.Name = _empSvc.FetchEmployee(empNum).Name;
model.Num = empNum;
model.Dependents = _peopleSvc.FetchDependentsForView(empNum);
model.Spouses = _peopleSvc.FetchDependentsForView(empNum);
return View(model);
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Employee(Models.EmployeeViewModel model)
{
if (!_empSvc.ValidateAndSaveName(model.Num, model.Name))
{
model.Dependents = _peopleSvc.FetchDependentsForView(model.Num);
model.Spouses = _peopleSvc.FetchDependentsForView(model.Num);
return View(model);
}
this.RedirectToAction(c => c.Index());
}
}
Questo
tutto sembrava bene fino a quando abbiamo iniziato a creare viste di grandi dimensioni (oltre 40 campi) con molti drop down e simili. Dato che le schermate avrebbero un'azione GET e POST (con il POST che restituisce una vista se c'era un errore di convalida), dovremmo duplicare il codice e rendere ViewModels più grande di quanto probabilmente dovrebbero essere.
Sto pensando che l'alternativa sarebbe quella di recuperare i dati tramite il servizio all'interno del ViewModel. La mia preoccupazione è che avremmo alcuni dati popolati dal ViewModel e alcuni dal controller (ad esempio nell'esempio sopra, il nome verrà popolato dal controller poiché è un valore pubblicato, mentre i dipendenti e i coniugi verranno popolati tramite tipo di funzione GetStaticData() nel ViewModel).
Pensieri?
IEnumerable? Cosa c'è nel modello poligamo? :-D –