2011-01-05 256 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視圖

的狀態所以我猜,是的,種類總是