我有以下模型:
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>
感谢您的帮助。
答案 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。