Получить URL-адрес мультимедиа в Umbraco 7, используя синтаксис GetProperty

Мне удается получить URL-адрес моего мультимедиа, используя следующий синтаксис:

Umbraco.Media(CurrentPage.MyImage).Url

Но когда я пытаюсь сделать то же самое, используя синтаксис GetProperty (странно, я некоторое время использовал getProperty из примеров в Интернете, но этот синтаксис всегда возвращал какой-то пустой динамический объект), который отлично работает для других свойств, я получаю всевозможные ошибки приведения:

// results in:
// System.InvalidOperationException: The value of parameter 'id' must 
// be either a string or an integer

Umbraco.Media(CurrentPage.GetProperty("myImage")).Url

// or
Umbraco.Media(CurrentPage.GetProperty("_myImage")).Url

И использование некоторой формы Umbraco.TypedContent<Media> привело только к большему количеству ошибок NRE и кастинга. В конечном итоге я попробовал следующее, но это всегда возвращало пустой список:

Umbraco.Media("myImage","umbracoFile")

Я не возражаю против использования динамического синтаксиса или любого другого синтаксиса в этом отношении, но я удивлен, что GetProperty явно возвращает что-то отличное от динамического синтаксиса.

В конечном счете, все, что я хотел, это использовать синтаксис _propName (имя с префиксом подчеркивания), чтобы получить свойство этой или любой родительской страницы, в зависимости от того, что установлено. Если не считать запроса списка AncestorOrSelf страниц, есть ли способ заставить это работать, используя «простой» синтаксис?

Быстрое обновление Если я делаю @CurrentPage.GetProperty("_defaultBackgroundImage"), я вижу идентификатор мультимедиа в HTML, но когда я пытаюсь передать его Umbraco.Media, я получаю InvalidOperationException значение параметра 'id' должно быть либо строкой, либо целое число. Приведение к int дает недопустимое приведение, а использование ToString возвращает имя типа. Должен быть какой-то способ вернуть то же целочисленное значение, которое я вижу, когда я вывожу его с использованием синтаксиса Razor @, верно?


person Abel    schedule 28.07.2015    source источник
comment
У меня это работает с неудобным синтаксисом, таким как Umbraco.Media( ((Umbraco.Core.Models .IPublishedProperty) CurrentPage.GetProperty("_myImage")).Value).Url, но это вряд ли кажется правильным. Без приведения я получаю ошибку объект не содержит метод или свойство 'Value'. Я думал, что возвращенный объект был динамическим объектом, но, видимо, это не так. Все еще интересно, это просто я не понимаю Umbraco, упущение в структуре Umbraco или просто по замыслу, и я должен просто жить с этим.   -  person Abel    schedule 28.07.2015
comment
Почему бы не использовать CurrentPage.GetPropertyValue<int>("_myImage"))?   -  person Davor Zlotrg    schedule 28.07.2015
comment
@DZL: я пробовал это, но всякий раз, когда я использовал типизированный синтаксис, я ничего не получал. Ваш код возвращает 0. Похоже, синтаксис подчеркивания не работает с GetPropertyValue<>. Если я удалю _, это сработает, но это не то, что мне нужно.   -  person Abel    schedule 28.07.2015
comment
Вы пытаетесь получить значение рекурсивно? Если это так, вы можете использовать CurrentPage.GetPropertyValue<int>("myImage", recursive: true, ifCannotConvert: string.Empty)   -  person Davor Zlotrg    schedule 28.07.2015
comment
@DZL: это то, что мне нужно, так просто (вы должны опубликовать это как ответ)! Да, мне нужна была рекурсивность. Рекурсивная функция с синтаксисом _propValue не работает с GetPropertyValue<>, но работает с GetProperty? Или это изменение в Umbraco 7? Он работает со вторым аргументом true.   -  person Abel    schedule 28.07.2015


Ответы (1)


Из комментариев выше:

То, что вы ищете, - это рекурсивное получение значения свойства.

Поскольку вы используете umbraco 7 вместо доступа к CurrentPage типа dynamic, я бы посоветовал вам использовать строго типизированное свойство Model.Content типа IPublishedContent.

Затем intellisense расскажет вам обо всех доступных методах, один из которых:

Umbraco.TypedMedia(Model.Content.GetPropertyValue<int>("myImage", recursive: true, ifCannotConvert: 0))

и это сработает.

То же самое касается метода Model.Content.GetProperty.

person Davor Zlotrg    schedule 28.07.2015
comment
Можно ли с уверенностью сказать, что синтаксис _propValue (с добавленным подчеркиванием для рекурсивности) был (преднамеренно?) удален для Umbraco 7 или никогда не применялся (не могу вспомнить в более старых версиях) для типизированного синтаксиса? - person Abel; 29.07.2015
comment
@Abel да, это правильно, я не уверен, когда они его отбросили, но в версии 7 вместо подчеркивания вы должны использовать перегрузку метода, которая принимает рекурсивность в качестве параметра. - person Davor Zlotrg; 29.07.2015