2

Automapper 構成にフォーマッターを追加して、すべてのDateTime?フィールドのスタイルを設定しようとしています。フォーマッターをグローバルに追加しようとしました:

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

私は何を間違っていますか?

ありがとう!

4

2 に答える 2

7

フォーマッターは、宛先メンバーの型が「string」型の場合にのみ適用されます。"Published" は "DateTime?" 型であるため、フォーマッタは適用されません。ここにはいくつかのオプションがあります。

  • 上記の動作で、Published プロパティを Post オブジェクトに追加します。
  • 最初に DateTime を解決する Published プロパティのカスタム リゾルバーを作成しますか? 値をプロパティ ロジックから取得し、Published で宛先メンバー タイプを文字列に変更します。まず、リゾルバーが実行されます。次に、フォーマッタはカスタム リゾルバの結果を取得し、最後に、結果の値が Published に設定されます。
  • HtmlHelper のようなものを使用して、View ですべてのカスタム Type -> String 書式設定を行います

通常は 1) を選択しますが、表示される値が本当にこのビューだけのものでない限り、オプション 2) を選択します。

于 2009-11-03T13:38:31.940 に答える
0

このようにしてみてください:

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

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

于 2009-10-30T23:41:09.773 に答える