在ASP.NET MVC ViewModel类中获取数据?

Bee*_*eep 13 asp.net-mvc

对于那些在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());
    }
 }
Run Code Online (Sandbox Code Playgroud)

这一切看起来都很好,直到我们开始创建具有许多下拉等的大视图(40多个字段).由于屏幕将具有GET和POST操作(如果存在验证错误,POST将返回视图),我们将复制代码并使ViewModel比应有的大.

我认为另一种方法是通过ViewModel中的服务获取数据.我担心的是,我们将从ViewModel填充一些数据,并从Controller中填充一些数据(例如,在上面的示例中,Name将从Controller填充,因为它是一个已发布的值,而Dependents和Spouses将通过一些填充ViewModel中的GetStaticData()函数类型.

思考?

Chu*_*way 7

我遇到了同样的问题.当代码对于动作方法来说太大时,我开始为每个动作创建类.是的,您将在类中进行一些数据检索,在控制器方法中进行一些检索.另一种方法是在类中进行所有数据检索,但是你不会真正需要的一半类,它们是为了一致性而创建的,或者在控制器方法中有所有数据检索,但同样,其中一些方法将会过于复杂,需要被抽象出来......所以选择你的毒药.我宁愿有一点不一致,并为工作找到合适的解决方案.

至于将行为放入ViewModel中,我不这样做,ViewModel的要点是用于从View设置和提取值的瘦类.

有些情况下我将转换方法放在ViewModel中.例如,我需要将ViewModel转换为相应的实体,或者我需要使用来自实体的数据加载ViewModel.

为了回答您的问题,我更喜欢在控制器/操作方法中检索数据.

通常使用DropDowns,我创建一个下拉服务.DropDowns往往是跨越视图的相同数据.通过服务中的下拉菜单,我可以在其他视图上使用它们和/或缓存它们.

根据布局,40多个字段可能会创建一个杂乱的视图.根据数据的类型,我会尝试使用某种选项卡式或向导界面跨多个视图跨越那么多字段.