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

问题描述 投票:1回答:1

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

但那根本不起作用。

我错过了什么?

c# automapper
1个回答
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)));

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

© www.soinside.com 2019 - 2024. All rights reserved.