观点之间的MVC ViewModel最佳实践

时间:2013-09-16 22:23:18

标签: asp.net-mvc automapper asp.net-mvc-viewmodel

我需要构建一些带有经典MVC架构的Web屏幕,其中包含Index页面(列出我所有类的实例),Details(检查我的类的详细信息),Edit(编辑类数据)和Delete(删除类实例)。

我正在使用Viewmodel和Automapper。我怀疑在这种情况下协调ViewModels和Automapper的正确方法,因为索引将包含一个类的集合,而每个其他视图只有一个实例:

提出代码:

选项1:每个视图一类:

public class Person
{ 
     int id;
     string Name;
     int Age;
}

public class PersonViewModel
{
     int id;

     [Display(name = "Person name")] 
     string Name;

     [Display(name = "Person age")] 
     int Age;
}

public class PersonIndexViewModel
{
     List<PersonViewModel> Personlist;
}


PersonController:

{
    var personList = db.List(); // Get data from db

    PersonIndexViewModel indexview = new PersonIndexViewModel();

    foreach (var item in personList)
    {  
         var tempview = new PersonViewModel();
         Map.Create (...); << Here ? How ?

         indexview.PersonList.Add (tempview);
    }

    return view (indexview);
}

OPTION2:ONE VIEWMODEL:

public class Person
{ 
     int id;
     string Name;
     int Age;
}

public class PersonViewModel
{
     int id;

     [Display(name = "Person name")] 
     string Name;

     [Display(name = "Person age")] 
     int Age;
}

PersonController:

{
    var personList = db.List(); // Get data from db

    List<PersonViewModel> viewList = new List<PersonViewModel>();


    foreach (var item in personList)
    {  

         var tempview = new PersonViewModel();
         Map.Create (...) // Here ? How ??
         viewList.Add (tempView);
     }

    return view (viewList);

}

如果选项2有什么问题吗?那个案子的最佳做法是什么? 谢谢!

1 个答案:

答案 0 :(得分:2)

这完全取决于你 - best practice ......这取决于你。我一开始很担心,但我真的学到了最佳实践是非常主观的。我们广泛使用AutoMapper,作为一般规则,我们有一个带有View和ViewModel的1-1地图。

但是,如果索引不包含其他属性,我们通常会返回IEnumerable<PersonViewModel>等。但是,我们经常发现,只要我们需要其他属性,我们就必须为索引输入ViewModel,例如过滤器等

此外,如果您想将列表映射到列表,请执行以下操作:

var model=Mapper.Map<List<PersonViewModel>>(personList)

不要在控制器中创建地图。在App启动的课堂中进行设置,请参阅此question

在AutoMapper上查看这些文章。这个one有点旧,但是当我们开始时它就是我们的灵感来源。 Jimmy Bogard的这个one概述了他们最初的方法(他创建了AutoMapper)。 This是关于他现在如何使用AutoMapper使用的一些提及

的想法