Para aquellos que crean ViewModels (para uso de vistas tipadas) en ASP.NET MVC, ¿prefieres recuperar los datos de un servicio/repositorio desde el ViewModel o las clases de controlador?Obteniendo datos dentro de una clase ASP.NET MVC ViewModel?
Por ejemplo, empezamos por tener ViewModels esencialmente siendo dtos y permitiendo que nuestros controladores para ir a buscar los datos (ejemplo groseramente simplificada asume que el usuario sólo puede cambiar el nombre del empleado):
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());
}
}
Este
todo parecía estar bien hasta comenzamos a crear vistas grandes (más de 40 campos) con muchos menús desplegables y tal. Como las pantallas tendrían una acción GET y POST (con POST devolviendo una vista si había un error de validación), estaríamos duplicando el código y haciendo ViewModels más grande de lo que probablemente debería ser.
Estoy pensando que la alternativa sería Obtener datos a través del Servicio dentro de ViewModel. Me preocupa que tengamos algunos datos poblados del ViewModel y algunos del Controlador (por ejemplo, en el ejemplo anterior, Nombre se llenaría del Controlador ya que es un valor publicado, mientras que Dependientes y Cónyuges se llenarían a través de algunos tipo de función GetStaticData() en ViewModel).
¿Pensamientos?
IEnumerable? ¿Qué pasa con el patrón polígamo? :-D –