2013-03-19 63 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