我在asp.net core 2.0项目中使用Automapper(通过DI)。
我的视图模型有一个字符串日期属性,我想将其映射到实体模型上的DateTime属性。
我不想为字符串指定日期时间的全局映射配置文件,我想为每个属性指定它。
这是我的映射配置文件:
CreateMap<JobDetailViewModel, JobDetail>()
.ForMember(x => x.StartDate, opt => opt.MapFrom(s => Convert.ToDateTime(s.StartDate)))
.ForMember(x => x.EndDate, opt => opt.MapFrom(s => Convert.ToDateTime(s.EndDate)));
这会产生一个异常:
字符串未被识别为有效的DateTime。
我已经将我的确切字符串剪切并粘贴到运行Convert.ToDateTime(dateString)
的控制台应用程序中,并且它工作正常,所以我认为这必须是一个问题,我如何定义映射。
我也尝试过:
CreateMap<JobDetailViewModel, JobDetail>()
.ForMember(x => x.StartDate, opt => opt.ResolveUsing(s => { return Convert.ToDateTime(s.StartDate); }))
.ForMember(x => x.EndDate, opt => opt.ResolveUsing(s => { return Convert.ToDateTime(s.EndDate); }));
但那根本不起作用。
我错过了什么?
我尝试构建模拟您的功能的小样本,它适用于我:
class Source
{
public string Foo { get; set; }
}
class Dest
{
public DateTime Bar { get; set; }
}
class Program
{
static void Main(string[] args)
{
Mapper.Initialize(cfg =>
{
cfg.CreateMap<Source, Dest>().ForMember(d => d.Bar, opt => opt.MapFrom(s => Convert.ToDateTime(s.Foo)));
});
var src = new Source { Foo = "01/01/2017" };
var dst = Mapper.Map<Dest>(src);
Console.WriteLine(dst.Bar);
}
}
我提到例外的唯一方法就是将错误的日期格式(例如日期首先在美国语言环境中)放入字符串中:
var src = new Source { Foo = "30.01.2017" }; // European date format, will fail
所以我会调试你究竟传递的是什么,你可以通过使用DateTime.ParseExact
(https://msdn.microsoft.com/en-us/library/w2sa9yss(v=vs.110).aspx)并传递精确的字符串来修复它,例如:
cfg.CreateMap<Source, Dest>().ForMember(d => d.Bar, opt => opt.MapFrom(s => DateTime.ParseExact(s.Foo, "dd.mm.yyyy", CultureInfo.InvariantCulture)));
您可以将多种格式传递给方法。