Question

J'essaie d'ajouter un formateur à ma configuration Automapper pour styliser tous les champs DateTime? . J'ai essayé d'ajouter mon formateur globalement:

Mapper.AddFormatter<DateStringFormatter>();

Et sur le mappage spécifique lui-même:

Mapper.CreateMap<Post, PostViewModel>()
            .ForMember(dto => dto.Published, opt => opt.AddFormatter<DateStringFormatter>());

Mais ni l'un ni l'autre ne semble fonctionner - il affiche toujours la date au format normal. Pour référence, voici le ViewModel que j'utilise, et le reste de la configuration:

public class DateStringFormatter : BaseFormatter<DateTime?>
{
    protected override string FormatValueCore(DateTime? value)
    {
        return value.Value.ToString("d");
    }
}

public abstract class BaseFormatter<T> : IValueFormatter
{
    public string FormatValue(ResolutionContext context)
    {
        if (context.SourceValue == null)
            return null;

        if (!(context.SourceValue is T))
            return context.SourceValue == null ? String.Empty : context.SourceValue.ToString();

        return FormatValueCore((T)context.SourceValue);
    }

    protected abstract string FormatValueCore(T value);
}

PostViewModel:

public int PostID { get; set; }
    public int BlogID { get; set; }
    public string UniqueUrl { get; set; }
    public string Title { get; set; }
    public string Body { get; set; }
    public string BodyShort { get; set; }
    public string ViewCount { get; set; }
    public DateTime CreatedOn { get; set; }

    private DateTime? published;
    public DateTime? Published
    {
        get
        {
            return (published.HasValue) ? published.Value : CreatedOn;
        }
        set
        {
            published = value;
        }
    }

Qu'est-ce que je fais de travers?

Merci!

Était-ce utile?

La solution

Les formats ne sont appliqués que lorsque le type de membre de destination est de type "chaîne". Depuis " Publié " est de type "DateTime?", le formateur n'est jamais appliqué. Vous avez quelques options ici:

  • Ajouter une propriété publiée à l'objet Post, avec le comportement présenté ci-dessus
  • Créez un résolveur personnalisé pour la propriété Publié, qui résout d'abord le DateTime? valeur de la logique de propriété, puis modifiez le type de membre de destination en chaîne sur Publié. Tout d'abord, le résolveur s'exécutera. Ensuite, le formateur prend le résultat du résolveur personnalisé et, finalement, la valeur résultante est définie sur Publié
  • Faites tout votre type personnalisé - > Formatage de chaîne dans la vue, avec des éléments comme un HtmlHelper

Nous allons généralement pour 1), à moins que la valeur affichée ne soit vraiment que pour cette vue, alors nous choisissons l'option 2).

Autres conseils

Essayez de le faire de cette façon:

Mapper.CreateMap<DateTime?, string>().ConvertUsing(d => d.Value.ToString("d"));

Vous pouvez modifier la fonction selon vos besoins.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top