2

我需要用经典的 MVC 架构构建一些 Web 屏幕,包含索引页面(列出我的类的所有实例)、详细信息(检查我的类的详细信息)、编辑(编辑类数据)和删除(删除类实例)。

我正在使用 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);
}

选项 2:一个视图模型:

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有什么问题吗?这种情况下的最佳做法是什么?谢谢!

4

1 回答 1

2

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

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

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

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

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

查看 AutoMapper 上的这些文章。这个有点老了,但是当我们开始的时候它给了我们灵感Jimmy Bogard 的这篇文章概述了他们最初的方法(他创建了 AutoMapper)。是他对他现在如何做 MVC 的想法,其中提到了 AutoMapper 的使用

于 2013-09-16T22:56:00.233 回答