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