想要在映射2个属性时将枚举类型转换为bool

时间:2012-02-21 19:14:02

标签: asp.net-mvc automapper

我有以下模型

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中指定对于我的FooViewModel的成员 IsValid IsFollowed ,必须要做一些特殊的事情才能将它转换为我模型的bool?< / p>

感谢您的帮助。

1 个答案:

答案 0 :(得分: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)
    );

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

或者您也可以使用custom value resolver