2010-01-15 3 views
6

Dans mon projet ASP.NET MVC 2 (RC) - J'utilise AutoMapper pour mapper entre une classe Linq to Sql (Media) et un modèle de vue (MediaVM). Le modèle de vue possède une propriété SelectList pour une liste déroulante dans la vue. J'ai un résolveur de valeur personnalisé pour remplir les éléments de propriété SelectList à partir de la base de données, mais je me demande s'il existe un moyen de transmettre certaines valeurs du modèle source dans le résolveur (en utilisant la méthode ConstructedBy?) Pour définir l'élément sélectionné) filtrer les éléments de la base de données. L'objet source est passé dans le résolveur personnalisé - mais le résolveur est utilisé sur plusieurs modèles de vue différents avec différents types d'objets source, préférant ainsi définir l'endroit d'où les valeurs proviennent de ma configuration de mappage. Voici mon modèle de vue:AutoMapper - Comment passer des paramètres dans un résolveur personnalisé en utilisant la méthode ConstructedBy?

La configuration de cartographie automapper:

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

Il serait agréable de pouvoir faire quelque chose comme ceci sur la clause de mise en correspondance .ForMember:

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

Y a-t-il un moyen d'accomplir cela?

+0

Bryan, comment peupler SelectList de DB? – awaisj

Répondre

2

J'ai trouvé votre message en essayant de faire la même chose. J'ai décidé d'une approche simple et sauter essayer de mapper à ma liste de sélection directement via AutoMaper. Je retourne simplement un tableau dans mon ViewModel et référence cet objet pour ma liste de sélection. Le tableau est mappé, l'objet de liste de sélection ne le fait pas. Simple, efficace. Et, à mon humble avis que chacun fait, il est destiné tâche - les cartes de Mapper, le ViewModel fait la mise en page

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

mon Mapper:

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

bonne idée. Merci! – Bryan

8

J'aime cette idée comme une demande de fonctionnalité. Vous pouvez faire quelque chose comme ça en ce moment, avec MapFrom:

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

merci jimmy! J'espérais que vous alliez entrer et confirmer que je ne manquais pas quelque chose d'évident. – Bryan

Questions connexes