在我的ASP.NET MVC 2(RC)项目中 - 我使用AutoMapper在Linq到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; }
}
automapper mapping config:
Mapper.CreateMap<Media, MediaVM>()
.ForMember(dest => dest.slUsers, opt => opt.ResolveUsing<UsersSelectListResolver>());
能够在.ForMember映射子句上执行类似的操作会很高兴:
.ConstructedBy(src => new UsersSelectListResolver(src.UserID, src.FilterVal))
有没有办法实现这个目标?
答案 0 :(得分:8)
我喜欢这个想法作为功能请求。您可以使用MapFrom:
立即执行此类操作ForMember(dest => dest.slUsers, opt => opt.MapFrom(src => new UsersSelectListResolver(src).Resolve(src));
答案 1 :(得分: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());