Вземете медиен 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, но това едва ли изглежда правилно. Без кастинга получавам грешка обектът не съдържа метод или свойство „Стойност“. Мислех, че върнатият обект е динамичен обект, но очевидно не е така. Все още се чудя дали просто аз не разбирам 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