Автоматический форматировщик не работает

StackOverflow https://stackoverflow.com/questions/1652749

  •  22-07-2019
  •  | 
  •  

Вопрос

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

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

Спасибо!

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top