2012-02-21 52 views
-1

映射時到bool我有以下模型想轉換枚舉類型2個屬性

public class Foo 
{ 
    [Key] 
    public int  FooID { get; set; } 
    public string Description { get; set; } 
    public bool  IsValid { get; set; } 
    public bool  IsFollowed { get; set; } 
} 

我有以下視圖模型

public class FooViewModel 
{ 
    public int FooId { get; set; } 
    public string Description { get; set; } 
    public YesNoEnumViewModel IsValid { get; set; } 
    public YesNoEnumViewModel IsFollowed { get; set; } 
} 

對於類型YesNoEnumViewModel我使用了以下枚舉:

public enum YesNoEnumViewModel 
{ 
    [Display(Name = "Yes", ResourceType = typeof(UserResource))] 
    Yes = 1, 
    [Display(Name = "No", ResourceType = typeof(UserResource))] 
    No = 2 
} 

在我的代碼中,我需要將我的viewModel映射到我的模型中。所以我試試這個:

[HttpPost] 
    public ActionResult AddedNew(FooViewModel viewModel) 
    { 
     if (!ModelState.IsValid) 
      return PartialView("AddedNew", viewModel); 

     var foo = Mapper.Map<FooViewModel, FooModel>(viewModel); 
     ... 
    } 

而我在試圖映射時出錯。該錯誤是從枚舉類型YesNoEnumViewModel轉換爲布爾(我的模型中的屬性是布爾類型)。

這裏是我的CreateMap:

Mapper.CreateMap<FooViewModel, Foo>(); 

也許我需要在CreateMap指定爲會員的IsValidIsFollowed我FooViewModel一些特殊必須完成將其轉換爲一個布爾我模型?

感謝您的幫助。

+0

[映射(自動映射器)需要將類型枚舉轉換爲布爾值時可能的重複(http://stackoverflow.com/questions/9382409/when-mapping-automapper-need-to-convert-a-type -enum-to-a-bool) – 2012-02-21 19:27:16

+0

這個問題是關於轉換enum類型的多個屬性的。 – Bronzato 2012-02-21 19:32:14

+0

@Bronzato難道你不是剛剛就這個問題提出一個幾乎相同的問題嗎? – Dismissile 2012-02-21 20:44:31

回答

2

AutoMapper不可能知道枚舉背後的語義,所以你不能指望它在沒有任何幫助的情況下映射它。你需要指定如何配置你的映射時,您的自定義枚舉轉換爲布爾:

Mapper 
    .CreateMap<FooViewModel, Foo>() 
    .ForMember(
     dest => dest.IsValid, 
     opt => opt.MapFrom(src => src.IsValid == YesNoEnumViewModel.Yes ? true : false) 
    ) 
    .ForMember(
     dest => dest.IsFollowed, 
     opt => opt.MapFrom(src => src.IsFollowed == YesNoEnumViewModel.Yes ? true : false) 
    ); 

和幹:

private static bool ToBool(YesNoEnumViewModel model) 
{ 
    return model == YesNoEnumViewModel.Yes ? true : false; 
} 

然後:

Mapper 
    .CreateMap<FooViewModel, Foo>() 
    .ForMember(
     dest => dest.IsValid, 
     opt => opt.MapFrom(src => ToBool(src.IsValid)) 
    ) 
    .ForMember(
     dest => dest.IsFollowed, 
     opt => opt.MapFrom(src => ToBool(src.IsFollowed)) 
    ); 

或者你也可以使用一個custom value resolver

+0

謝謝你,這比我做的要乾淨得多。只有一個問題:我非常瞭解'dest'是針對目的地的,'src'是針對來源的,但'opt'的含義是什麼? – Bronzato 2012-02-22 07:53:42