Dla tych, którzy tworzą ViewModels (do użycia przez wpisane widoki) w ASP.NET MVC, wolisz pobierać dane z usługi/repozytorium z poziomu ViewModel lub klas kontrolera?Pobieranie danych w klasie ASP.NET MVC ViewModel?
Na przykład, zaczęliśmy poprzez ViewModels istocie bycia DTOs i pozwalając nasze Sterowniki do pobierania danych (rażąco uproszczony przykład zakłada, że użytkownik może zmienić tylko nazwisko pracownika):
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());
}
}
To wszystko wydawało się w porządku, dopóki zaczęliśmy tworzyć duże widoki (40 + pola) z wieloma opcjami i takimi. Ponieważ ekrany miałyby działanie GET i POST (z POST zwracającym widok, jeśli wystąpił błąd sprawdzania poprawności), kopiowalibyśmy kod i powodowałby, że ViewModels byłby większy niż prawdopodobnie powinien.
Myślę, że alternatywą byłoby pobranie danych za pośrednictwem usługi w ramach ViewModel. Obawiam się, że wtedy będziemy mieli pewne dane wypełnione przez ViewModel, a niektóre z Kontrolera (np. W powyższym przykładzie, Nazwa będzie wypełniana przez Kontrolera, ponieważ jest to wartość zaksięgowana, natomiast Dependenci i małżonkowie będą zapełniani przez niektóre typ funkcji GetStaticData() w ViewModel).
Myśli?
IEnumerable? Co jest z wzorcem poligamistycznym? :-D –