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

3

我使用以下语法成功获取了我的媒体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中看到媒体ID,但是当我尝试将其提供给Umbraco.Media时,我会收到InvalidOperationException的错误提示:参数'id'的值必须是字符串或整数。强制转换为int会导致无效转换,并且使用ToString返回类型名称。肯定有某种方法可以获得与使用Razor @-语法输出时相同的整数值,对吧?


我已经用笨拙的语法 Umbraco.Media(((Umbraco.Core.Models.IPublishedProperty)CurrentPage.GetProperty("_myImage")).Value).Url 让它工作了,但这似乎不太对。如果没有强制转换,我会得到一个“对象不包含 'Value' 方法或属性”的错误。我以为返回的对象是一个动态对象,但显然不是。仍然在想这是不是只是我不理解 Umbraco,Umbraco 框架中的疏忽,还是“按设计”而应该接受它。 - Abel
2
为什么不使用 CurrentPage.GetPropertyValue<int>("_myImage")) - Davor Zlotrg
@DZL:我已经尝试过了,但每当我使用打字的语法时,我什么也得不到。你的代码返回0。看起来下划线语法在GetPropertyValue<>中不起作用。如果我去掉下划线,它可以工作,但那不是我想要的。 - Abel
1
你是否试图递归获取该值?如果是,你可以使用 CurrentPage.GetPropertyValue<int>("myImage", recursive: true, ifCannotConvert: string.Empty) - Davor Zlotrg
@DZL:这就是我需要的,太简单了(你应该把它作为答案发布)!是的,我需要递归。使用_propValue语法的递归特性在GetPropertyValue<>中不起作用,但在GetProperty中起作用吗?还是Umbraco 7中有所改变?它可以通过第二个参数设置为true来实现。 - Abel
1个回答

3

从上面的评论中可以看出:

您需要递归获取属性值。

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

然后智能感知会告诉您所有可用的方法之一是:

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

它会生效。

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


可以这样说,为了实现类型化语法,Umbraco 7是否故意放弃了使用_propValue语法(添加下划线以进行递归),或者从未实现过(无法记得旧版本)? - Abel
@Abel 是的,没错。我不确定他们是什么时候放弃了这个方法,但在7版本中,你应该使用接受递归参数的方法重载来代替下划线。 - Davor Zlotrg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接