题
我正在尝试将格式化程序添加到我的 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;
}
}
我究竟做错了什么?
谢谢!
解决方案
仅当目标成员类型为“string”类型时才应用格式化程序。由于“Published”的类型为“DateTime?”,因此永远不会应用格式化程序。您在这里有几个选择:
- 将 Published 属性添加到 Post 对象,其行为如上所述
- 为 Published 属性创建一个自定义解析器,它首先解析 DateTime?属性逻辑中的值,然后在已发布时将目标成员类型更改为字符串。首先,解析器将执行。接下来,格式化程序获取自定义解析程序的结果,最后将结果值设置为 Published
- 使用 HtmlHelper 之类的工具在视图中执行所有自定义类型 -> 字符串格式化
我们通常选择 1),除非显示的值确实仅适用于该视图,否则我们选择选项 2)。
其他提示
尝试做这种方式:
Mapper.CreateMap<DateTime?, string>().ConvertUsing(d => d.Value.ToString("d"));
您可以更改功能,满足您的要求。
不隶属于 StackOverflow