AutoMapper Formatter nicht funktioniert
-
22-07-2019 - |
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!
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.