使用 GetProperty 语法在 Umbraco 7 中获取媒体 url

Get media url in Umbraco 7 using GetProperty syntax

我设法使用以下语法获取我的媒体 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 显然 returns 与动态语法有所不同。

最终,我想要的只是使用 _propName 语法(下划线前缀名称)来获取此页面或任何父页面的 属性,以设置者为准。除了查询 AncestorOrSelf 页面列表之外,是否有某种方法可以使用 "simple" 语法使其工作?

更新快 如果我这样做 @CurrentPage.GetProperty("_defaultBackgroundImage"),我会在 HTML 中看到媒体 ID,但是当我尝试将其提供给 Umbraco.Media 时,我会得到 InvalidOperationException 参数的值'id' 必须是字符串或整数。强制转换为 int 会给出无效的强制转换并使用 ToString returns 类型名称。一定有某种方法可以取回我在使用 Razor @-syntax 输出时看到的相同整数值,对吗?

来自以上评论:

您正在寻找的是递归地获取 属性 值。

由于您使用的是 umbraco 7 而不是访问类型为 dynamicCurrentPage 我建议您使用强类型 Model.Content 属性 这是类型 IPublishedContent

然后 intellisense 会告诉您所有可用的方法,其中之一是:

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

它会起作用。

Model.Content.GetProperty方法也是如此。