2010-08-13 5 views
2

Comment obtenir les propriétés de mon BLL transmises à un ModeView. Par exemple, j'ai cette classe dans une bibliothèque de classes séparées:MVC2 ViewModel Binding

[MetadataType(typeof(PersonMetaData))] 
public partial class Person 
{   
    [Bind(Include = "PersonId,DepartmentId,FirstName,LastName,Active,DateAdded,DateDeleted")] 
    public class PersonMetaData 
    {   
     public object PersonId { get; set; } 

     public object DepartmentId { get; set; } 

     public object FirstName { get; set; } 

     public object LastName { get; set; } 

     public Department PersonDepartment { get; set; } 

     public string FullName() 
     { 
      return string.Format("{0} {1}", FirstName, LastName); 
     } 
    } 
} 

Mon ViewModel ressemble à ceci:

public class PersonViewModel 
{ 
    public int PersonId { get; set; } 
    public string FullName{ get; set; } 
    public string PersonDepartment { get; set; } 
} 

Quand je produis un nouveau « Voir » fortement typé au PersonViewModel et défini comme "Liste" Afficher le contenu .... la page est générée, mais FullName ne s'affiche pas.

J'ai créé la propriété PersonDepartment car je souhaite afficher le nom du département dans lequel se trouve la personne. Une classe de service a été créée de manière similaire. Par exemple, je veux être capable de faire quelque chose comme "PersonDepartment.DepartmentName" qui affiche le nom du département sur la page. J'utilise DBML (Linq To SQL), donc les classes partielles s'étendent à partir des classes générées automatiquement.

Je ne suis pas sûr de savoir comment remplir la propriété FullName et la transmettre à ViewModel et obtenir les propriétés de département connectées aux informations de personne transmises. Toute aide serait grandement appréciée.

+2

Je suppose bien sûr que vous remplissez le modèle de vue avant de le passer à la vue, oui? – joshlrogers

+0

Désolé - oui. ViewModel est rempli à l'aide de la DLL AutoMapper. Le mappage fonctionne car la propriété PersonId est en fait transmise. – obautista

Répondre

1

Vous avez mentionné que vous utilisez AutoMapper. Dans votre modèle FullName est une méthode et non une propriété. AutoMapper ne mappe pas automatiquement aux méthodes. Selon le conventions, vous pouvez préfixer le nom de votre méthode avec Get pour faire cela fonctionne:

public string GetFullName() 
{ 
    return string.Format("{0} {1}", FirstName, LastName); 
} 

Ce sera mis en correspondance avec la propriété FullName dans le modèle de vue. Une autre option est de déclarer explicitement comment le mappage est effectué:

Mapper.CreateMap<Person, PersonViewModel>() 
     .ForMember(
      dest => dest.FullName, 
      opt => opt.MapFrom(src => src.FullName()) 
    ); 

En ce qui concerne la propriété du nom du département est concerné, je vous recommande de modifier votre modèle de sorte qu'au lieu d'une propriété DepartmentId il a directement une propriété appelée Department contenant l'identifiant et le nom qui vous permettront de les mapper facilement dans votre modèle de vue. Si vous ne pouvez pas modifier votre modèle de cette façon, vous pouvez avoir la propriété Department dans le modèle de vue directement dans le référentiel et non par AutoMapper.