У меня возникли проблемы с получением 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.
Как это не работает? –
Например, для поля StartDateTime.DateTime Я ожидаю 2013-09-02T06: 20: 00, но вместо этого я получаю 1/1/0001. Вы видите что-то не так с тем, что я пытаюсь сделать? – mobese46
См. Новый править – mobese46