我需要构建一些带有经典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有什么问题吗?那个案子的最佳做法是什么? 谢谢!
答案 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使用的一些提及
的想法