2012-07-03 106 views
0

我有一個「列表」視圖,它基本上接收IEnumerable(Thing)類型的模型。我無法控制事物;它是外在的。從IEnumerable模型初始化IEnumerable ViewModels

這幾乎沒有問題。 'Thing'的一個屬性是標誌的枚舉。我想在視圖中改進此屬性的格式。我有read some strategies。我的計劃是創建一個更好地瞭解格式的ViewModel。

我想知道是否有直接的方式從IEnumerable(Thing)創建IEnumerable(ViewThing)。

一個顯而易見的方法是遍歷IEnumerable的東西,對於每個東西我會創建一個ViewThing並用Thing的數據填充它,產生一個IEnumerable的ViewThings。

但是備份,我也有興趣更聰明的方式來處理格式化標誌以供查看。

回答

1

您可以使用AutoMapper來映射您的域模型和視圖模型。這個想法是,你定義ThingThingViewModel之間的映射,然後讓你不必重複AutoMapper會照顧這些對象的映射集合:

public ActionResult Foo() 
{ 
    IEnumerable<Thing> things = ... get the things from whererver you are getting them 
    IEnumerable<ThingViewModel> thingViewModels = Mapper.Map<IEnumerable<Thing>, IEnumerable<ThingViewModel>>(things); 
    return View(thingViewModels); 
} 

現在,所有剩下的就是定義之間的映射a ThingThingViewModel

Mapper 
    .CreateMap<Thing, ThingViewModel>(). 
    .ForMember(
     dest => dest.SomeProperty, 
     opt => opt.MapFrom(src => ... map from the enum property) 
    ) 
+0

謝謝。我想知道定義映射的合理位置在哪裏?它可能只能用在一個地方,在一個控制器中。 –

+0

如果使用AutoMapper,映射('CreateMap')應該只在應用程序的整個生命週期中定義一次,所以理想情況下這應該是一個從'Application_Start'調用的方法。如果您不想使用AutoMapper在域模型和視圖模型之間建立映射層,那麼控制器操作可能是放置此映射邏輯的好地方。 –

+0

謝謝澄清。 –