Automapper Formatter无法正常工作

时间:2009-10-30 23:17:56

标签: automapper formatter

我正在尝试将格式化程序添加到我的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 个答案:

答案 0 :(得分:7)

仅在目标成员类型为“string”类型时应用格式化程序。由于“已发布”的类型为“DateTime?”,因此格式化程序永远不会被应用。你有几个选择:

  • 将已发布的属性添加到Post对象,其行为列于上面
  • 为已发布的属性创建自定义解析程序,该解析程序首先解析DateTime?来自属性逻辑的​​值,然后将目标成员类型更改为已发布的字符串。首先,解析器将执行。接下来,格式化程序获取自定义解析程序的结果,最后,在Published
  • 上设置结果值
  • 执行所有自定义类型 - &gt;视图中的字符串格式,包括HtmlHelper
  • 之类的内容

我们通常会选择1),除非显示的值仅适用于此视图,否则我们选择2)。

答案 1 :(得分:0)

尝试这样做:

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

您可以更改功能以满足您的要求。