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

有没有办法做到这一点?

4

2 回答 2

8

我喜欢这个想法作为功能请求。您现在可以使用 MapFrom 执行类似的操作:

ForMember(dest => dest.slUsers, opt => opt.MapFrom(src => new UsersSelectListResolver(src).Resolve(src));
于 2010-01-17T19:54:45.643 回答
2

我发现你的帖子试图做同样的事情。我决定采用一种简单的方法,并跳过尝试直接通过 AutoMaper 映射到我的选择列表。我只是将一个数组返回到我的 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());     
于 2010-01-16T20:49:51.527 回答