質問

すべての 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"));

要件に合わせて機能を変更できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top