При отображении (automapper) необходимо преобразовать тип enum в bool - PullRequest
1 голос
/ 21 февраля 2012

У меня есть следующая модель :

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 необходимо сделать что-то особенное, чтобы преобразовать его в логическое значение моей модели?

Спасибо за вашу помощь.

1 Ответ

3 голосов
/ 21 февраля 2012

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

Точно, вам нужно создать собственный Resolver, который знает, как разрешить YesNoEnumViewModel в Boolean:

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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...