2011-01-05 73 views
13

我目前正试图弄清楚何时使用ViewModels以及何时不使用ViewModels。我使用Automapper的任务,目前有以下代码:ASP.NET MVC - 使用Automapper进行映射

// AccountController.cs

[AuthWhereRole(Roles = AuthorizeRole.Developer)] 
public ActionResult List() 
{ 
    MembershipUserCollection users = _memberShipService.GetAllUsers(); 
    IEnumerable<ListUsersViewModel> viewModel = 
      Mapper.Map<IEnumerable<MembershipUser>, IEnumerable<ListUsersViewModel>>(users.Cast<MembershipUser>().AsEnumerable()); 

    return View("List", viewModel); 
} 

// ListUsersViewModel.cs

public class ListUsersViewModel 
{ 
    public Guid Id { get; set; } 
    public virtual string UserName { get; set; } 
    public string LastLogOn { get; set; } 
} 

// Bootstrapper.cs

public static void ConfigureAutoMapper() 
{ 
    Mapper.CreateMap<MembershipUser, ListUsersViewModel>() 
      .ForMember(x => x.UserName, o => o.MapFrom(s => s.UserName)) 
      .ForMember(x => x.Id, o => o.MapFrom(s => s.ProviderUserKey)) 
      .ForMember(x => x.LastLogOn, o => o.MapFrom(s => s.LastLoginDate)); 
} 

我不知道它是不好的做法是否映射像这只是排除在t一些属性他的领域模型? - 我应该总是使用视图模型,即使不需要?

在此先感谢。

回答

14

总之,是的,你应该总是使用ViewModel。

我们使用AutoMapper对我们的项目,最初我们没有为每个视图单独的ViewModels。我们发现如果对象具有相互引用(即用户具有包含用户的角色的登录),则会出现一些性能问题。 AutoMapper不知道何时停止建立这些集合。

虽然这不是简单的页面,比如一个在您的示例中的问题,我们决定创建该规定只能由视图模型neede属性每个View一个视图模型。这解决了权限问题,并使查看视图所需的信息变得非常简单。

吉米·博加德谈到在博客下面这个方法:http://www.lostechies.com/blogs/jimmy_bogard/archive/2009/06/29/how-we-do-mvc-view-models.aspx

+0

这与我自己的经验非常相似。 – adamjford 2011-01-05 19:34:37

9

这里有AutoMapper一个伟大的文章和的ViewModels
http://weblogs.asp.net/shijuvarghese/archive/2010/02/01/view-model-pattern-and-automapper-in-asp-net-mvc-applications.aspx

一些要点。

你的问题should I always use View Models, even when not needed?

在博客文章中评论说

域对象是专为需求域模型,它代表着我们的应用的领域。另一方面,View Model对象是为了我们对视图的需求而设计的。

这里是如何他使用automapper描述。我认为AutoMapper的想法是它会根据属性的名称映射它的内容。

[HttpPost] 
public ActionResult Create(ContactViewModel contactToCreate) { 

if (ModelState.IsValid) { 
    Contact newContact = new Contact(); 
    AutoMapper.Mapper.Map(contactToCreate, newContact); 
    contactRepository.CreateContact(contactToCreate.GroupId, newContact); 
} 
} 
0

在我不那么丰富的经验,凭经验去如下:

  • 对于显示域意见模型原样(就像在你点击“编辑”按钮之前的记录),你可以使用你的普通模型。虽然这不会阻止你创建另一个简单扩展你的领域模型的类,所以将来你不必同时触摸Controller和View。
  • 对于其他情况:ViewModels。下面是为什么
    • 如果您有总数(如类中的学生人数),而不是在视图上计算,ViewModel应该有自己的方法。
    • 分页。通常在显示多条记录时,您可以选择:AllRecords或一些分页堆栈(例如20,50,100)。领域模型应该只服务于业务逻辑一般(和阻止您可以添加您的电话号码是“鱼”为例),但视图模型而言mantaining视图

的状态所以我猜,是的,种类总是