【问题标题】:Automapper Formatter not working自动映射器格式化程序不起作用
【发布时间】:2009-10-30 23:17:55
【问题描述】:

我正在尝试将格式化程序添加到我的 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);
}

后视图模型:

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

我做错了什么?

谢谢!

【问题讨论】:

    标签: automapper formatter


    【解决方案1】:

    仅当目标成员类型为“字符串”类型时才应用格式化程序。由于“Published”的类型为“DateTime?”,因此格式化程序永远不会被应用。你有几个选择:

    • 将 Published 属性添加到 Post 对象,行为如上所示
    • 为 Published 属性创建一个自定义解析器,它首先解析 DateTime?属性逻辑中的值,然后在已发布时将目标成员类型更改为字符串。首先,解析器将执行。接下来,格式化程序获取自定义解析器的结果,最后,将结果值设置为 Published
    • 在视图中执行所有自定义类型 -> 字符串格式设置,例如 HtmlHelper

    我们通常选择 1),除非显示的值确实只针对该视图,否则我们选择选项 2)。

    【讨论】:

    • 谢谢 Jimmy,我选择了选项 #2。我还有其他一些具有相同类型字段的源对象。刚开始使用 Automapper,到目前为止很喜欢它。
    • 你有你是如何做到的样本吗?
    【解决方案2】:

    尝试这样做:

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

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

    【讨论】:

    • 这似乎也不起作用......每次我写出我的“已发布”字段......它以相同的格式写出日期:MM / DD / YYYY HH:MM: SS PM AutoMapper 似乎根本没有影响该字段......使用“ConvertUsing”或自定义格式化程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多