Как получить данные изображения из динамической коллекции модулей в Sitefinity 10?
В настоящее время я борюсь с получением данных изображения из моей коллекции элементов динамического модуля.
Я пытался искать различные ресурсы, но все еще не могу найти решение.
У меня есть тип IQueryable, который содержит коллекцию элементов динамического модуля. Затем я конвертирую эту коллекцию, используя LINQ select, чтобы отфильтровать данные и вернуть пользовательский тип. Смотрите следующее:
IQueryable<DynamicContent> collection = (Query to Sitefinity for my custom dynamic module items);
return collection.Select(b => new CustomType()
{
Title = b.GetValue<string>("Title"),
Body = b.GetValue<string>("Body"),
ExternalLink = b.GetValue<string>("ExternalLink"),
Image = b.GetRelatedItems<Image>("Image")
});
Когда я пытаюсь выполнить все вышеперечисленное, заполняются все остальные свойства, кроме свойства Image, которое возвращает пустой объект Image. Но когда я использую один элемент:
collection.FirstOrDefault().GetRelatedItems<Image>("Image")
Выше будет возвращать объект изображения.
Не знаете, почему я не могу запросить данные изображения в моей коллекции IQueryable, но только при использовании одного элемента, есть идеи?
Спасибо вам всем!
1 ответ
На основе документации Sitefinity ( http://docs.sitefinity.com/for-developers-related-data-api):
При использовании с API связанных данных необходимо работать с основными версиями как связанного элемента данных, так и элемента, с которым вы создаете отношение.
Проблема в том, что когда вы запрашиваете коллекцию collection = (Query to Sitefinity for my custom dynamic module items);
, вы не фильтруете по версии Master.
В вашем случае есть два решения:
1) Фильтр коллекции только для мастера
collection = collection.Where(i=>i.Status == Telerik.Sitefinity.GenericContent.Model.ContentLifecycleStatus.Master);
2) За каждую живую версию получите своего Мастера
var masterItem = dynamicModuleManager.Lifecycle.GetMaster(itemLive);
PS Это работает для collection.FirstOrDefault().GetRelatedItems<Image>("Image")
потому что самый первый элемент в коллекции - Мастер
PPS GetRelatedItems замедлит ваш запрос, лучший способ использовать ContentLinks API, это во много раз быстрее. Пример:
var contentLinksManager = ContentLinksManager.GetManager();
var librariesManager= LibrariesManager.GetManager();
var masterId = data.OriginalContentId; //IF data is Live status or data.Id if is Master status
var imageFileLink = contentLinksManager.GetContentLinks().FirstOrDefault(cl=>cl.ParentItemId == masterId && cl.ComponentPropertyName == "Image");
if (imageFileLink != null)
{
var image= librariesManager.GetImage(imageFileLink.ChildItemId);
if (image!= null)
{
// Work with image object
}
}