2010-01-15 30 views
6

En mi proyecto ASP.NET MVC 2 (RC) - Estoy usando AutoMapper para mapear entre una clase de Linq a Sql (Media) y un modelo de vista (MediaVM). El modelo de vista tiene una propiedad SelectList para un menú desplegable en la vista. Tengo un resolvedor de valores personalizado para completar los elementos de la propiedad SelectList desde el db, pero me pregunto si hay una forma de pasar un par de valores desde el modelo fuente al resolver (usando el método ConstrutedBy?) Para a) definir el elemento seleccionado y b) filtrar los elementos de la base de datos. El objeto fuente pasa a la resolución personalizada, pero la resolución se usa en varios modelos de vista diferentes con diferentes tipos de objetos fuente, por lo que preferiría definir de dónde obtener los valores en mi configuración de asignación. Aquí está mi vista del modelo:AutoMapper: cómo pasar parámetros a un solucionador personalizado usando el método ConstrutedBy?

La configuración de mapeo AutoMapper:

Mapper.CreateMap<Media, MediaVM>() 
     .ForMember(dest => dest.slUsers, opt => opt.ResolveUsing<UsersSelectListResolver>()); 

que sería bueno para ser capaz de hacer algo como esto en la cláusula .ForMember mapeo:

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

¿Hay alguna manera de lograr esto?

+0

Bryan, ¿cómo se puede completar SelectList desde DB? – awaisj

Respuesta

2

Encontré su publicación tratando de hacer lo mismo. Decidí un enfoque simple y omitir el intento de asignar a mi lista de selección directamente a través de AutoMaper. Simplemente devuelvo una matriz en mi ViewModel y hago referencia a ese objeto para mi lista de selección. La matriz se asigna, la lista de selección no lo hace. Simple, efectivo. Y, en mi humilde opinión que cada uno está haciendo es la intención de tareas - los mapas asignador, el modelo de vista que hace el diseño

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"); 
      } 
     } 

mi asignador:

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

buena idea. ¡Gracias! – Bryan

8

me gusta esa idea como una solicitud de función. Puede hacer algo como eso en este momento, con MapFrom:

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

gracias Jimmy! esperaba que tocara y confirmara que no me estaba perdiendo algo obvio. – Bryan

Cuestiones relacionadas