1

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

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

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

public DateTime? Deadline { get; set; }

如何在映射后不检查这些值以查找最小日期并设置为 null(我已实施临时黑客以便代码运行),而使这些值为 null?

4

1 回答 1

0

使用 LinqPad 和 AutoMapper 2.2.1 下面给了我一个有效的日期 when KeyValuehas a date 和 a null DateTimewhen KeyValueis 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值有关。

于 2013-03-20T11:10:45.957 回答