Automapper Formatterが機能しない
-
22-07-2019 - |
質問
すべての DateTime?
フィールドをスタイルするために、Automapper構成にフォーマッターを追加しようとしています。フォーマッターをグローバルに追加しようとしました:
Mapper.AddFormatter<DateStringFormatter>();
特定のマッピング自体について:
Mapper.CreateMap<Post, PostViewModel>()
.ForMember(dto => dto.Published, opt => opt.AddFormatter<DateStringFormatter>());
しかし、どちらも機能しないようです-常に通常の形式で日付を出力します。参考のために、私が使用しているViewModelとその他の構成を次に示します。
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;
}
}
何が間違っているのですか?
ありがとう!
解決
フォーマッターは、宛先メンバーのタイプが&quot; string&quot;タイプの場合にのみ適用されます。 「公開済み」以来タイプが&quot; DateTime?&quot;の場合、フォーマッタは適用されません。ここにはいくつかのオプションがあります:
- 公開されたプロパティをPostオブジェクトに追加し、上記の動作を設定します
- DateTimeを最初に解決するPublishedプロパティのカスタムリゾルバーを作成しますか?プロパティロジックから値を取得してから、発行先の宛先メンバータイプを文字列に変更します。最初に、リゾルバーが実行されます。次に、フォーマッタはカスタムリゾルバの結果を取得し、最後に結果の値が発行済みに設定されます
- カスタムタイプをすべて実行する-&gt; HtmlHelperのようなものを使用したビューでの文字列の書式設定
通常は1)に進みます。表示される値が本当にこのビュー専用である場合を除き、オプション2)に進みます。
他のヒント
この方法で試してください:
Mapper.CreateMap<DateTime?, string>().ConvertUsing(d => d.Value.ToString("d"));
要件に合わせて機能を変更できます。
所属していません StackOverflow