Frage

Ich versuche, einen Formatierer meine AutoMapper Konfiguration hinzuzufügen alle DateTime? Felder stylen. Ich habe versucht, meine Formatierer global und fügte hinzu:

Mapper.AddFormatter<DateStringFormatter>();

Und auf die spezifische Zuordnung selbst:

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

Doch scheint weder zu arbeiten - es gibt immer das Datum im normalen Format. Als Referenz, hier ist der Viewmodel ich verwende, und der Rest der Konfiguration:

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

Was mache ich falsch?

Danke!

War es hilfreich?

Lösung

Formatter wird nur angewandt, wenn der Zielelementtyp vom Typ „string“ ist. Seit „Veröffentlicht“ vom Typ „Datetime?“ Ist, wird die Forma nie angewandt. Sie haben ein paar Möglichkeiten:

  • Fügen Sie eine veröffentlichte Eigenschaft des Post-Objekt, mit dem Verhalten, das oben angelegt
  • Erstellen Sie eine benutzerdefinierte Resolver für die veröffentlichte Eigenschaft, die zuerst die Datetime löst? Wert aus der Eigenschaft Logik, dann den Typ String Ziel Mitglied ändern auf Veröffentlicht. Zunächst wird der Resolver auszuführen. Als nächstes nimmt die Forma das Ergebnis des benutzerdefinierten Resolver, und schließlich wird der resultierende Wert auf Veröffentlicht
  • set
  • Sie alle Ihre Wünsch Art -> String Formatierung in der Ansicht, mit Dingen wie einer Htmlhelper

Wir in der Regel für 1 gehen), es sei denn, der angezeigte Wert wirklich nur für diese Ansicht ist, dann gehen wir für Option 2).

Andere Tipps

Versuchen Sie es auf diese Weise tun:

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

Sie können die Funktion ändern, um Ihre Anforderungen gerecht zu werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top