2013-03-19 2 views
1

Я работаю над проектом MVC 4 и пытаюсь преобразовать значение в список KeyValue в нулевое значение DateTime. Я использовал следующую строку в картографа (я не включены другие свойства, поскольку есть много)Automapper resolveusing не возвращает нули

.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, не превышая значения после отображения искать даты мин и установить пустое значение (временный хак я положил на месте, так что код работает)?

+0

Что такое 'KeyValue'? Это класс, который вы определили? – Graham

+0

Вы пытались разрешить нулевые значения назначения? 'Mapper.Initialize (c => c.AllowNullDestinationValues ​​= true);' – Mightymuke

+0

KeyValue - это объект бизнес-уровня, поэтому я не знаю, что это полная цель, поскольку я работаю исключительно на уровне пользовательского интерфейса, включая написание сопоставлений от бизнеса до уровня пользовательского интерфейса, но Я могу опубликовать подробности об этом для ясности, если вы считаете его важным @Graham? –

ответ

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.

+0

Спасибо @Mightymuke, я не представил определения классов, поскольку я опасался включать слишком много нерелевантного кода, ваше упрощение выглядит разумным для меня. Я использую версию 2.0 automapper, вы думаете, что это может быть проблемой? –

+0

Может быть. Я знаю, что были недавние исправления, связанные с отображением нулей для полей с нулевым значением, но не могут найти конкретную проблему, которая может быть связана с этим. Например: https://github.com/AutoMapper/AutoMapper/issues/257 – Mightymuke

+0

Спасибо за вашу помощь в этом @Mightymuke, я очень ценю время, которое вы потратили. Я думаю, что сейчас я оставлю свой взломан, поскольку слишком поздно в цикле модернизировать automapper для этого проекта. В определенном случае я обязательно буду использовать последнюю версию. –

Смежные вопросы