2013-09-18 2 views
0

У меня возникли проблемы с получением DateTime из DateTimeField прикрепленной части I, динамически созданной и прикрепленной к типу контента при переносе.Orchard CMS получить DateTimeField из прикрепленной части

структура такова:

CourseDate (ContentType) 
    ProductPart (attached part from other project) 
    CourseDatePart (attached part) 
    TimeSpanPart (attached part from "dynamically" created part) 

Я пытаюсь вытащить StartDateTime и EndDateTime, которые являются DateTimeField, из TimeSpanPart. Однако свойство DateTime всегда равно 1/1/0001

Вот код, который я использую, чтобы вытащить значения. Все остальное работает, за исключением TimeSpanPart.

private EditCourseViewModel BuildEditorViewModel(CoursePart part) 
    { 
     var courseDates = _contentManager.Query<CourseDatePart, CourseDatePartRecord>().Where(x => x.CourseId == part.Id) 
      .List<CourseDatePart>() 
      .Select(x => 

       new CourseDateViewModel 
       { 
        Id = x.Id, 
        StartDate = ((dynamic) x.ContentItem).TimeSpanPart.StartDateTime.DateTime, 
        EndDate = ((dynamic) x.ContentItem).TimeSpanPart.EndDateTime.DateTime, 
        Sku = ((dynamic) x.ContentItem).ProductPart.Sku, 
        IsDigital = ((dynamic) x.ContentItem).ProductPart.IsDigital, 
        Inventory = x.Inventory 
       } 

      ); 

когда я проверить значение x.Record.ContentItemRecord.Data, можно увидеть, что данные, которые я хочу есть:

<Data><TimeSpanPart><StartDateTime>2013-09-02T06:20:00.0000000</StartDateTime><EndDateTime>2013-09-21T00:05:00.0000000</EndDateTime></TimeSpanPart></Data> 

Вот соответствующие части миграции:

 ContentDefinitionManager.AlterPartDefinition("TimeSpanPart", part=>part 
      .Attachable() 
      .WithField("StartDateTime", f=>f.OfType("DateTimeField").WithDisplayName("Start Date Time")) 
      .WithField("EndDateTime", f=>f.OfType("DateTimeField").WithDisplayName("End Date Time")) 
      ); 

     ContentDefinitionManager.AlterTypeDefinition("CourseDate", type=>type 
      .WithPart(typeof(CourseDatePart).Name) 
      .WithPart("TimeSpanPart") 
      .WithPart(typeof(ProductPart).Name) 
      ); 

Edit:

я вырыл немного глубже в класс Orchard InfosetStorageProvider, где он управляет хранилищем для полей. В методе BindStorage он передает элемент XML данных методу Get. Но вместо передачи infosetPart.Infoset.Element (который имеет данные, которые я хочу показать выше), он передает infosetPart.ContentItem.VersionRecord, потому что это не null; это пустой элемент XML вместо: < Data/>

return new SimpleFieldStorage(
       (name, valueType) => Get(infosetPart.ContentItem.VersionRecord == null ? infosetPart.Infoset.Element : infosetPart.VersionInfoset.Element, partName, fieldName, name), 
       (name, valueType, value) => Set(infosetPart.ContentItem.VersionRecord == null ? infosetPart.Infoset.Element : infosetPart.VersionInfoset.Element, partName, fieldName, name, value)); 
     } 

Как заставить его правильно заполнить данные в infosetPart.ContentItem.VersionRecord? Является ли это ошибкой в ​​Orchard в том, что она передает пустой элемент xml < вместо нуля, чтобы вместо этого передать infosetPart.Infoset.Element методу Get, или я делаю что-то неправильно? Я не знаю, какая разница между infosetPart.ContentItem.VersionRecord и infosetPart.Infoset.Element.

+0

Как это не работает? –

+0

Например, для поля StartDateTime.DateTime Я ожидаю 2013-09-02T06: 20: 00, но вместо этого я получаю 1/1/0001. Вы видите что-то не так с тем, что я пытаюсь сделать? – mobese46

+0

См. Новый править – mobese46

ответ

0

Проблема заключалась в том, что при создании элемента контента я устанавливал значения полей перед созданием элемента контента. Из-за этого он помещал значения в таблицу Orchard_Framework_ContentItemRecord вместо Orchard_Framework_ContentItemVersionRecord.

Смотрите здесь сообщенную «ошибка» по Piedone и закрыл Себастьян Ros, который дал мне ответ: http://orchard.codeplex.com/workitem/18412

Я никогда бы не подумал о задании значений после создания объекта. По-прежнему кажется, что что-то не совсем верно в том, что если значение в таблице ContentItemVersionRecord было бы установлено в NULL вместо < Data/>, это сработало бы.

До:

  var courseDate = _contentManager.New("CourseDate"); 

      var courseDatePart = courseDate.As<CourseDatePart>(); 

      courseDatePart.CourseId = coursePart.Id; 
      courseDatePart.Inventory = newDate.Inventory; 

      dynamic courseDateDyn = courseDate; 

      courseDateDyn.TimeSpanPart.StartDateTime.DateTime = newDate.StartDate.Value; 
      courseDateDyn.TimeSpanPart.EndDateTime.DateTime = newDate.EndDate.Value; 

      var product = courseDate.As<ProductPart>(); 

      product.Sku = newDate.Sku; 
      product.IsDigital = newDate.IsDigital; 

      //This should move up before setting field values. 
      _contentManager.Create(courseDate); 

После:

  var courseDate = _contentManager.New("CourseDate"); 

      var courseDatePart = courseDate.As<CourseDatePart>(); 

      courseDatePart.CourseId = coursePart.Id; 
      courseDatePart.Inventory = newDate.Inventory; 

      //This needs to happen before we set any values on the fields. 
      _contentManager.Create(courseDate); 

      dynamic courseDateDyn = courseDate; 

      courseDateDyn.TimeSpanPart.StartDateTime.DateTime = newDate.StartDate.Value; 
      courseDateDyn.TimeSpanPart.EndDateTime.DateTime = newDate.EndDate.Value; 

      var product = courseDate.As<ProductPart>(); 

      product.Sku = newDate.Sku; 
      product.IsDigital = newDate.IsDigital; 
Смежные вопросы