【发布时间】:2009-09-23 04:48:43
【问题描述】:
对于在 ASP.NET MVC 中创建 ViewModel(供类型化视图使用)的用户,您更喜欢从 ViewModel 中的服务/存储库中获取数据,还是从控制器类中获取数据?
例如,我们首先让 ViewModel 本质上是 DTO,并允许我们的控制器获取数据(非常简单的示例假设用户只能更改员工姓名):
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());
}
}
这一切看起来都很好,直到我们开始创建带有许多下拉菜单等的大视图(40 多个字段)。由于屏幕会有一个 GET 和 POST 操作(如果出现验证错误,POST 返回一个视图),我们将复制代码并使 ViewModel 比它们应该的更大。
我认为另一种方法是通过 ViewModel 中的服务获取数据。我担心的是,我们会从 ViewModel 填充一些数据,从 Controller 填充一些数据(例如,在上面的示例中,Name 将从 Controller 填充,因为它是一个发布的值,而 Dependents 和 Spouses 将通过一些填充ViewModel 中 GetStaticData() 函数的类型)。
想法?
【问题讨论】:
-
IEnumerable?一夫多妻制模式是怎么回事? :-D
标签: asp.net-mvc