Как получить данные изображения из динамической коллекции модулей в 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
    }
}
Другие вопросы по тегам