Domanda

Sto cercando di aggiungere un formattatore alla mia configurazione di Automapper per dare uno stile a tutti i campi DateTime? . Ho provato ad aggiungere il mio formatter a livello globale:

Mapper.AddFormatter<DateStringFormatter>();

E sulla stessa mappatura specifica:

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

Ma nessuno dei due sembra funzionare: genera sempre la data nel formato normale. Per riferimento, ecco il ViewModel che sto usando e il resto della configurazione:

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

Cosa sto sbagliando?

Grazie!

È stato utile?

Soluzione

I formattatori vengono applicati solo quando il tipo di membro di destinazione è di tipo "stringa". Dal momento che " pubblicato " è di tipo " DateTime? " il formatter non viene mai applicato. Hai alcune opzioni qui:

  • Aggiungi una proprietà pubblicata all'oggetto Post, con il comportamento sopra indicato
  • Creare un resolver personalizzato per la proprietà Pubblicato, che risolve per primo DateTime? valore dalla logica della proprietà, quindi modificare il tipo di membro di destinazione in stringa su Pubblicato. Innanzitutto, il resolver verrà eseguito. Successivamente, il formatter prende il risultato del risolutore personalizzato e, infine, il valore risultante è impostato su Pubblicato
  • Esegui tutto il tuo tipo personalizzato - > Formattazione delle stringhe nella vista, con elementi come un HtmlHelper

Di solito andiamo per 1), a meno che il valore visualizzato non sia veramente solo per questa vista, quindi andiamo per l'opzione 2).

Altri suggerimenti

Prova a farlo in questo modo:

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

È possibile modificare la funzione per soddisfare le proprie esigenze.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top