2013-03-19 39 views
1

我正在处理MVC 4项目并尝试将KeyValue列表中的值转换为可为空的DateTime。我已经使用的映射以下行(我不包括其他属性也有不少)Automapper使用不返回空值

.ForMember(d => d.Deadline, m => m.ResolveUsing<DeadlineResolver>()) 

我的解析器是这样的:

public class DeadlineResolver : ValueResolver<Booking, DateTime?> 
{ 
    protected override DateTime? ResolveCore(Booking source, ResolutionResult resolutionResult) 
    { 
     KeyValue keyValue = source.KeyValues.FirstOrDefault(k => k.Key.KeyId == "DEADLINE"); 
     return (keyValue != null) ? DateTime.Parse(keyValue.Value) : (DateTime?)null; 
    } 
} 

期限的值,它是定义如下所示不会返回为空,而是返回DateTime.MinDate。当我在视图中绑定结果时,我需要它为空,以便在有日期时仅显示值。

public DateTime? Deadline { get; set; } 

如何使这些值空但不超过该值映射后找分钟日期和设置为null(临时劈我已经到位,使代码运行)?

+0

什么是KeyValue?这是你定义的类吗? – Graham 2013-03-19 18:21:18

+0

您是否尝试过允许空目的地值? 'Mapper.Initialize(c => c.AllowNullDestinationValues = true);' – Mightymuke 2013-03-19 23:54:42

+0

KeyValue是一个业务层对象,所以我不知道它的全部用途,因为我专门在UI层上工作,包括从业务层到UI层写入映射,但如果您认为它的重要@Graham,我可以将它的详细信息发布清楚。 – 2013-03-20 08:50:21

回答

0

使用LinqPad和AutoMapper 2.2.1下面给我一个有效的日期时KeyValue有一个日期,和nullDateTimeKeyValuenull。 (请注意,由于没有提供类定义,因此解析器会进行细微的更改以简化它)。

void Main() 
{ 
    AutoMapper.Mapper.CreateMap<Booking, dest>() 
     .ForMember(d => d.Deadline, m => m.ResolveUsing<DeadlineResolver>()); 
    AutoMapper.Mapper.AssertConfigurationIsValid(); 

    // Gives a valid DateTime 
    var booking = new Booking { KeyValue = "2013-01-01" }; 
    booking.Dump(); 
    var rc = AutoMapper.Mapper.Map<Booking, dest>(booking); 
    rc.Dump(); 

    // Gives a null DateTime 
    booking = new Booking { KeyValue = null }; 
    booking.Dump(); 
    rc = AutoMapper.Mapper.Map<Booking, dest>(booking); 
    rc.Dump(); 
} 

// Define other methods and classes here 
public class Booking 
{ 
    public string KeyValue { get; set; } 
} 

public class dest 
{ 
    public DateTime? Deadline { get; set; } 
} 

public class DeadlineResolver : AutoMapper.ValueResolver<Booking, DateTime?> 
{ 
    protected override DateTime? ResolveCore(Booking source) 
    { 
     return (source.KeyValue != null) 
      ? DateTime.Parse(source.KeyValue) 
      : (DateTime?)null; 
    } 
} 

这是你以后的功能?如果是这样,那么问题可能是旧版本的AutoMapper,或者是一个意想不到的KeyValue值。

+0

感谢@Mightymuke,我没有提供类定义,因为我担心包含太多不相关的代码,您的简化对我来说看起来很合理。我正在使用automapper的verion 2.0,你认为这可能是问题吗? – 2013-03-20 15:55:26

+0

可能是。我知道最近有一些与可映射空值映射空值有关的修复,但找不到可能与此相关的特定问题。例如:https://github.com/AutoMapper/AutoMapper/issues/257 – Mightymuke 2013-03-20 18:00:14

+0

感谢您对@Mightymuke的所有帮助,我非常感谢您花费的时间。我认为我现在要离开我的黑客,因为升级此项目的automapper的周期已经太晚了。尽管如此,我一定会确保我使用的是最新版本。 – 2013-03-21 08:11:45