Automapper解决了不返回空值的问题

时间:2013-03-19 17:58:37

标签: asp.net-mvc-4 automapper

我正在研究MVC 4项目,并尝试将KeyValue列表中的值转换为可为空的DateTime。我在mapper中使用了以下行(我没有包括其他属性,因为有很多)

.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; 
    }
}

如下所示定义的截止日期的值永远不会返回null,而是返回DateTime.MinDate。当我在一个视图中绑定结果时,我需要它为null,这样我只在有日期时显示一个值。

public DateTime? Deadline { get; set; }

如何在映射到查找最小日期并设置为null之后将这些值设为null而不检查值(我已经实施了临时工具以便代码运行)?

1 个答案:

答案 0 :(得分:0)

使用LinqPad和AutoMapper 2.2.1,以下为KeyValue有约会时的有效日期,以及nullDateTime时的KeyValue null }。 (注意,由于未提供类定义,因此对解析器进行了少量更改以简化它。)

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值。