2010-05-06 5 views
1

Je comprends que je peux configurer AutoMapper de la manière suivante et lors du mappage, il doit formater toutes les dates du modèle source selon les règles définies dans IValueFormatter et définir le résultat sur le modèle mappé .AutoMapper: Utilisation de IValueFormatter sur tout le site pour des types donnés

ForSourceType<DateTime>().AddFormatter<StandardDateFormatter>(); 
ForSourceType<DateTime?>().AddFormatter<StandardDateFormatter>(); 

Je ne reçois aucun effet pour ma classe mappée avec ceci. Il ne fonctionne que quand je fais ce qui suit:

Mapper.CreateMap<Member, MemberForm>().ForMember(x => x.DateOfBirth, y => y.AddFormatter<StandardDateFormatter>()); 

Je délimiterai DateTime? Member.DateOfBirth à string MemberForm.DateOfBirth. Le formateur crée essentiellement une chaîne de date courte à partir de la date.

Y a-t-il quelque chose qui me manque lors de la définition du formateur par défaut pour un type donné?

Merci

public class StandardDateFormatter : IValueFormatter 
{ 
    public string FormatValue(ResolutionContext context) 
    { 
     if (context.SourceValue == null) 
      return null; 

     if (!(context.SourceValue is DateTime)) 
      return context.SourceValue.ToNullSafeString(); 

     return ((DateTime)context.SourceValue).ToShortDateString(); 
    } 
} 

Répondre

5

J'ai eu le même problème et a trouvé une solution. Essayez de changer:

ForSourceType<DateTime>().AddFormatter<StandardDateFormatter>(); 

Pour

Mapper.ForSourceType<DateTime>().AddFormatter<StandardDateFormatter>(); 
1

J'utilise AutoMapper v1.

Il y a une classe abstraite là qui fait la plupart du travail de grunt appelé ValueFormatter.

Mon code:

public class DateStringFormatter : ValueFormatter<DateTime> 
{ 
    protected override string FormatValueCore(DateTime value) 
    { 
     return value.ToString("dd MMM yyyy"); 
    } 
} 

Puis dans mon profil classe:

public sealed class ViewModelMapperProfile : Profile 
{ 
    ... 

    protected override void Configure() 
    { 
     ForSourceType<DateTime>().AddFormatter<DateStringFormatter>(); 

     CreateMap<dto, viewModel>() 
      .ForMember(dto => dto.DateSomething, opt => opt.MapFrom(src => src.DateFormatted)); 

}

+0

Merci pour votre aide. J'ai essayé ces exemples, mais toujours pas de chance. Je vais juste continuer à ajouter le formateur pour chaque champ. – CRice

2

Pour votre information - méthode AddFormatter est obsolète dans la version 3.0. Vous pouvez utiliser ConvertUsing à la place:

Mapper.CreateMap<DateTime, string>() 
    .ConvertUsing<DateTimeCustomConverter>(); 

public class DateTimeCustomConverter : ITypeConverter<DateTime, string> 
{ 
    public string Convert(ResolutionContext context) 
    { 
     if (context.SourceValue == null) 
      return null; 
     if (!(context.SourceValue is DateTime)) 
      return context.SourceValue.ToNullSafeString(); 
     return ((DateTime)context.SourceValue).ToShortDateString(); 
    } 
}