Automapper Formatter не работает - PullRequest
       14

Automapper Formatter не работает

2 голосов
/ 31 октября 2009

Я пытаюсь добавить форматер в мою конфигурацию 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;
        }
    }

Что я делаю не так?

Спасибо!

Ответы [ 2 ]

7 голосов
/ 03 ноября 2009

Форматтеры применяются только тогда, когда тип элемента назначения имеет тип "string". Поскольку «Опубликовано» имеет тип «DateTime?», Средство форматирования никогда не применяется. У вас есть несколько вариантов здесь:

  • Добавление свойства Опубликовать в объект Post с поведением, изложенным выше
  • Создайте пользовательский распознаватель для свойства Опубликовано, который сначала разрешает DateTime? значение из логики свойства, затем измените тип элемента назначения на строку в публикации. Сначала решатель будет выполнен. Затем средство форматирования принимает результат пользовательского преобразователя, и, наконец, результирующее значение устанавливается на Опубликовано
  • Делайте все ваши собственные Типы -> Форматирование строк в представлении, с такими вещами, как HtmlHelper

Обычно мы выбираем 1), если отображаемое значение действительно только для этого представления, тогда мы перейдем к варианту 2).

0 голосов
/ 31 октября 2009

Попробуйте сделать это так:

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

Вы можете изменить функцию в соответствии с вашими требованиями.

...