自动传输日期到字符串转换不起作用

时间:2017-12-30 17:34:50

标签: c# automapper

我在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); }));

但这根本不起作用。

我错过了什么?

1 个答案:

答案 0 :(得分:0)

我尝试构建模仿您的功能的小样本,它对我有用:

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.ParseExacthttps://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)));

您可以将多种格式传递给方法。