AutoMapper - 如何使用 ConstructedBy 方法将参数传递到自定义解析器中?

7
在我的ASP.NET MVC 2 (RC)项目中,我使用AutoMapper将Linq to Sql类(Media)和视图模型(MediaVM)之间进行映射。视图模型具有一个SelectList属性用于在视图中显示下拉列表。我有一个自定义的值解析器来从数据库中填充SelectList属性项,但我想知道是否有一种方法可以通过源模型传递一些值到解析器中(使用ConstructedBy方法?)来a)定义所选项和b)过滤从数据库中获取的项。源对象被传递到自定义解析器中 - 但是解析器在多个不同类型的源对象上使用,因此更愿意在我的映射配置中定义从哪里获取这些值。以下是我的视图模型:
public class MediaVM
{
    public bool Active { get; set; }
    public string Name { get; set; }

    [UIHint("DropDownList")]
    [DisplayName("Users")]
    public SelectList slUsers { get; private set; }
}        

自动映射程序的映射配置:
    Mapper.CreateMap<Media, MediaVM>()
        .ForMember(dest => dest.slUsers, opt => opt.ResolveUsing<UsersSelectListResolver>());

希望能在 .ForMember 映射子句中实现以下类似操作:

.ConstructedBy(src => new UsersSelectListResolver(src.UserID, src.FilterVal))

有没有方法可以实现这个?

Bryan,你如何从数据库中填充SelectList? - awaisj
2个回答

8

作为一个功能请求,我认为这个想法很不错。你现在可以通过使用MapFrom来实现类似的功能:

ForMember(dest => dest.slUsers, opt => opt.MapFrom(src => new UsersSelectListResolver(src).Resolve(src));

谢谢Jimmy!我希望你能加入并确认我没有错过什么显而易见的东西。 - Bryan

2

我发现你的帖子想要做同样的事情。我选择了一种简单的方法,跳过尝试通过AutoMapper直接映射到我的选择列表。我只需将一个数组返回到我的ViewModel中,并引用该对象作为我的选择列表。数组被映射,选择列表对象未被映射。简单而有效。在我看来,每个任务都在执行其预期的任务-映射器映射,ViewModel进行布局。

View Model code:
        [DisplayName("Criterion Type")]
        public virtual CriterionType[] CriterionTypes { get; set; }

        [DisplayName("Criterion Type")]
        public SelectList CriterionTypeList
        {
            get
            {
                return new SelectList(CriterionTypes, "Id", "Key");
            }
        }  

我的映射器:

 Mapper.CreateMap<Criterion, CriterionForm>()
            .ForMember(dest => dest.CriterionTypeList, opt => opt.Ignore());     

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接