Какой тип объекта используется для одного свойства связанного изображения в Sitefinity?

Я добавил настраиваемое поле в виджет новостей с именем RelatedImage, которое я хочу отобразить в пользовательском шаблоне MVC списка новостей.

Примечание: настраиваемое поле - это поле "Связанные мультимедиа (изображения, видео, файлы)" с ограничением "Несколько изображений может быть загружено или выбрано".

Я могу получить URL изображения, просматривая пользовательское поле следующим образом:

@foreach (var relatedItem in item.Fields.RelatedImage)
{
    <li>@relatedItem.Fields.MediaUrl</li>
}  

Приведенный выше код работает и отображает URL.

Код, подобный этому, выводит правильное значение:

@item.Fields.RelatedImage.Length

Однако при установке ограничения "Только 1 изображение может быть загружено или выбрано" модель, используемая для @item.Fields.RelatedImage изменяется так, что приведенный выше код генерирует исключения, потому что эти свойства не существуют.

Что мне нужно, так это рендерить только одно изображение на новость в списке, но когда я переключаюсь в режим ограничения "Только 1 изображение...", я не могу понять, как выглядит модель или как ее получить. владение его свойствами. Поэтому следующий код не будет работать:

@item.RelatedItem("RelatedImage").Fields.MediaUrl

Так что вопрос для меня сейчас очень неприятный: как я узнаю, какая модель передается в мой шаблон / представление? Я пытался выводить различные GetType().ToString() варианты, но все, что я неоднократно получаю, это ItemViewModel, который не помогает!

Изменить - следующий код на самом деле работает:

<img src="@Html.Raw(item.Fields.RelatedImage.Fields.MediaUrl)" />

Но это было крайне сложно понять. Как понять, что такое Type RelatedImage. Свойство Fields имеет динамический тип, что усложняет задачу.

1 ответ

Решение

Если RelatedImage поле установлено, чтобы разрешить 1 изображение, возвращаемое значение будет иметь тип Telerik.Sitefinity.Libraries.Model.Image,

Если в поле разрешено использование нескольких изображений, возвращаемое значение будет массивом одного типа, т.е. Telerik.Sitefinity.Libraries.Model.Image[]

Чтобы ответить на ваш вопрос, вы можете проверить тип RelatedImage имущество:

@if (item.Fields.RelatedImage is Image)
{
    <img src="item.Fields.RelatedImage.Fields.MediaUrl" />
}
else if (item.Fields.RelatedImage is Image[])
{
    foreach (var relatedItem in item.Fields.RelatedImage)
    {
        <img src="relatedItem.Fields.MediaUrl" />
    } 
}

Лучшим способом может быть использование GetRelatedItems расширение найдено в Telerik.Sitefinity.RelatedData.RelatedDataExtensions например, при построении модели вида

viewModel.RelatedImages = newsItem.GetRelatedItems<Image>("RelatedImage")

который возвращает коллекцию объектов Image, независимо от количества выбранных изображений.

Другие вопросы по тегам