是否可以访问Umbraco中动态合成模型的属性?

时间:2017-10-27 08:01:35

标签: umbraco umbraco7

我的网站上有一些不同的样式/模板。这些模板都用于我网站上的合成。这是我的文档类型的一个例子:

Layouts (folder)
    Style 1
    Style 2
    Style 3
Products (folder)
    ProductsPage
    Product
News (folder)
    NewsOverview
    NewsPage

这基本上就是它的样子。除了ProductNewsPage之外,所有这些模板都有模板,但它们有Style X作为组合。这是我的内容节点的样子:

Home
    Products
        Product 1 (Style 2)
        Product 2 (Style 3)
        Product 3 (Style 2)
        Product 4 (Style 1)
    News
        Article 1 (Style 1)
        Article 2 (Style 3)

等等。你明白了吗? Style X文档类型都是组合,因此我不必反复设置同一页面的样式,但我仍然可以创建任何我想要的页面样式。

现在,在我的父母(例如NewsOverview)上,我想访问孩子们的属性。在NewsOverview模板文件中,我必须这样做:

@foreach(var article in Model.Content.Children) {
    dynamic image = article;
    <img src="@image.OverviewImage[0].Url" />
    <p>@article.GetPropertyValue("overviewTitle")</p>
}

我不能在不使用字符串或强制转换为动态(基本上)的情况下访问属性,虽然我的模型设置为Dll,我通常可以使用intellisense进行Model.Content.PROPERTY等等。

我怎样才能做到这一点?如何在不使用动态的情况下访问属性?我知道孩子们不一定都是一样的,但我所有风格的页面都包含相同的属性,它们在模板中的排列方式不同。

3 个答案:

答案 0 :(得分:1)

有一个名为Children<T>()的方法可以获取某种类型的所有子文档,因此可以安全地在foreach中进行投射:

@foreach(Article article in Model.Content.Children<Article>()) {
    <img src="@article.OverviewImage.First().Url" />
    <p>@article.OverviewTitle</p>
}

您可能希望在article.OverviewImage.First()周围添加一些逻辑,就像OverviewImage没有值一样,它会抛出空引用异常。

答案 1 :(得分:0)

您是否已将父模型添加到模板中?:

@inherits UmbracoViewPage<ContentModels.Product>
@using ContentModels = Umbraco.Web.PublishedContentModels;

答案 2 :(得分:0)

您可能需要将孩子转换为特定类型:

@using ContentModels = Umbraco.Web.PublishedContentModels;

@foreach (var article in Model.Content.Children.Select(child => new ContentModels.NewsPage(child)) {
    <img src="@article .OverviewImage.First().Url" />
    <p>@article.OverviewTitle</p>
}

.Children()只会获得IPublishedContent类型的子项,因为ModelsBuilder不知道当前页面下可以存在哪些类型的文档。