2009-10-30 6 views
2

Automapper 구성에 포맷터를 추가하여 모든 DateTime? 필드의 스타일을 지정하려고합니다.Automapper Formatter가 작동하지 않습니다.

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

을 뭐하는 거지?

감사합니다.

답변

7

형식 지정자는 대상 멤버 유형이 "문자열"유형 인 경우에만 적용됩니다. "Published"유형이 "DateTime?"이므로 형식 기가 적용되지 않습니다. 당신은 여기에 몇 가지 옵션이 있습니다

  • 먼저 날짜 시간을 해결
  • 이 게시 된 속성에 대한 사용자 지정 해결을 만들기 위에 배치 동작과, 포스트 개체에 게시 된 속성을 추가 하시겠습니까? 값을 속성 논리에서 가져온 다음 대상 멤버 유형을 게시시 문자열로 변경합니다. 먼저 리졸버가 실행됩니다. 다음으로, 포맷터는 사용자 지정 해결의 결과를 받아, 마지막으로 결과 값이 설정되어 게시
  • 수행 사용자 정의 유형의 모든 -> 문자열은 Html 헬퍼 같은 것들로,보기에 서식

표시되는 값이 실제로이보기에만 해당되는 경우가 아니면 일반적으로 1)로 이동 한 다음 2) 옵션으로 이동합니다.

+0

감사합니다 지미, 옵션 2와 함께갔습니다. 이 같은 유형의 필드를 가진 몇 가지 다른 소스 객체가 있습니다. Automapper로 시작하여 지금까지 그것을 좋아합니다. – leftend

+0

어떻게했는지 샘플을 가지고 있습니까? – ntombela

0

이런 식으로 일을 시도해보십시오

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

당신은 당신의 요구 사항을 충족하기 위해 기능을 변경할 수 있습니다.

+0

"Published"필드를 쓸 때마다 ... 같은 형식으로 날짜를 기록합니다. MM/DD/YYYY HH : MM : SS PM It AutoMapper가 "ConvertUsing"또는 사용자 정의 포맷터를 사용하여 해당 필드에 전혀 영향을 미치지 않는 것처럼 보입니다. – leftend