【问题标题】:Automapper resolveusing not returning nulls使用不返回空值的 Automapper 解析
【发布时间】:2013-03-20 19:10:45
【问题描述】:

我正在开发一个 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(我已实施临时黑客以便代码运行)?

【问题讨论】:

  • 什么是KeyValue?这是你定义的类吗?
  • 您是否尝试过允许空目标值? Mapper.Initialize(c =&gt; c.AllowNullDestinationValues = true);
  • KeyValue 是一个业务层对象,所以我不知道它的全部用途,因为我只在 UI 层上工作,包括编写从业务到 UI 层的映射,但为了清楚起见,我可以发布它的详细信息如果您认为这很重要@Graham?
  • @Mightymuke 感谢您的想法,我们确实在配置文件中设置了 AllowNullDestinationValues = true。
  • 您使用的是什么版本的 AutoMapper?

标签: asp.net-mvc-4 automapper


【解决方案1】:

使用 LinqPad 和 AutoMapper 2.2.1,当KeyValue 有日期时,以下给我一个有效日期,当KeyValuenull 时,null DateTime 给我一个有效日期。 (请注意,由于未提供类定义,因此对解析器进行了细微更改以简化它)。

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

【讨论】:

  • 感谢@Mightymuke,我没有提供类定义,因为我担心包含太多不相关的代码,您的简化对我来说看起来很合理。我正在使用 automapper 2.0 版,你认为这可能是问题吗?
  • 可能是。我确实知道最近有一些与映射可空字段的空值相关的修复,但找不到可能与此相关的具体问题。例如:github.com/AutoMapper/AutoMapper/issues/257
  • 感谢您对 @Mightymuke 的所有帮助,我非常感谢您花费的时间。我想我现在要把我的 hack 留在原地,因为在周期中为这个项目升级 automapper 为时已晚。不过,我一定会确保下次使用的是最新版本。
猜你喜欢
  • 2016-04-07
  • 1970-01-01
  • 1970-01-01
  • 2020-12-09
  • 1970-01-01
  • 1970-01-01
  • 2011-08-05
  • 1970-01-01
  • 2013-03-06
相关资源
最近更新 更多