문제

나는 automapper 구성에 Formatter를 추가하려고 노력하고 있습니다. DateTime? 필드. 전 세계적으로 내 포맷터를 추가하려고 시도했습니다.

Mapper.AddFormatter<DateStringFormatter>();

그리고 특정 매핑 자체에서 :

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

그러나 어느 것도 작동하지 않는 것 같습니다. 항상 날짜를 일반 형식으로 출력합니다. 참조 할 때 여기에 내가 사용하는 뷰 모델과 나머지 구성은 다음과 같습니다.

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

내가 뭘 잘못하고 있죠?

감사!

도움이 되었습니까?

해결책

Formatters는 대상 멤버 유형이 "String"유형 인 경우에만 적용됩니다. "게시 된"이 유형의 "DateTime?"이므로 Formatter는 결코 적용되지 않습니다. 여기에는 몇 가지 옵션이 있습니다.

  • 위에 놓인 동작과 함께 게시 된 속성을 게시물 객체에 추가하십시오.
  • 먼저 DateTime을 해결하는 게시 된 속성에 대한 사용자 정의 리졸버를 만듭니다. 속성 로직에서 값을 발행 한 다음 게시 된 대상 멤버 유형을 문자열로 변경하십시오. 먼저, 리졸버가 실행됩니다. 다음으로 Formatter는 사용자 정의 리졸버의 결과를 가져오고 마지막으로 결과 값이 게시되었습니다.
  • htmlhelper와 같은 내용으로 모든 사용자 정의 유형 -> 문자열 서식을 수행하십시오.

우리는 보통 1), 표시되는 값이 진정 으로이 견해에만 해당되지 않는 한, 옵션 2로갑니다.

다른 팁

이렇게 시도해보십시오.

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

요구 사항을 충족하도록 기능을 변경할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top