Хотел бы преобразовать тип enum в bool при отображении для 2 свойств - PullRequest
0 голосов
/ 21 февраля 2012

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

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 в bool (свойство в моей модели имеет тип bool).

Вот мой CreateMap:

Mapper.CreateMap<FooViewModel, Foo>();

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

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

1 Ответ

2 голосов
/ 22 февраля 2012

AutoMapper не может знать семантику вашего перечисления, поэтому вы не можете ожидать, что он отобразит это без вашей помощи.Вам нужно указать, как преобразовать ваш пользовательский enum в логическое значение при настройке отображения:

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)
    );

и в DRY:

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))
    );

Или вы также можете использовать распознаватель пользовательских значений .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...