2012-02-21 2 views
1

У меня есть следующие модели:При отображении (automapper) необходимо преобразовать тип перечисления в BOOL

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

У меня есть следующий вид модели:

public class FooViewModel 
{ 
    public int FooId { get; set; } 
    public string Description { get; set; } 
    public YesNoEnumViewModel IsValid{ 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 в bool (свойство в моей модели имеет тип bool).

Вот мой CreateMap:

Mapper.CreateMap<FooViewModel, Foo>(); 

Может быть, мне нужно указать в CreateMap, что для члена IsValid моего FooViewModel что-то особенное должно быть сделано, чтобы преобразовать его в булево моей модели?

Благодарим за помощь.

ответ

3

«Возможно, мне нужно указать в CreateMap, что для члена IsValid моего FooViewModel нужно сделать что-то особенное, чтобы преобразовать его в bool моей модели?»

Ровно, вам нужно создать пользовательский Разрешитель, который знает, как решить YesNoEnumViewModel в логическое значение:

Mapper.CreateMap<FooViewModel, Foo>(). 
    ForMember(dest => dest.IsValid, opt => opt.ResolveUsing<EnumResolver>()); 

internal class EnumResolver : ValueResolver<FooViewModel, bool> 
{ 
    protected override bool ResolveCore(FooViewModel vm) 
    { 
     return vm.IsValid == YesNoEnumViewModel.Yes; 
    } 
} 
+0

Спасибо! Но что, если у меня есть свойство IsValid1 и IsValid2? Как использовать резольвер в этом сценарии, потому что в EnumResolver у нас есть только один возврат (определенный здесь для IsValid)? – Bronzato

+0

Просто создайте больше сопоставлений в CreateMap: ForMember (dest => dest.IsValid1, opt => opt.ResolveUsing ()). ForMember (dest => dest.IsValid2, opt => opt.ResolveUsing ()); –

+0

Проблема - это возвращаемое значение в ResolveCore, которое всегда возвращается для того же свойства (здесь IsValid), но для сценария, где мы имеем IsValid1 и IsValid2: что вернуть? – Bronzato

Смежные вопросы