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

是否可以访问Umbraco中动态合成模型的属性?,umbraco,umbraco7,Umbraco,Umbraco7,我的网站上有一些不同的样式/模板。这些模板都用于我的网站上的作文。以下是我的文档类型示例: Layouts (folder) Style 1 Style 2 Style 3 Products (folder) ProductsPage Product News (folder) NewsOverview NewsPage 基本上就是这个样子。除了产品和新闻页面之外,所有这些都有模板,但它们都有样式X作为组合。以下是我的内容节点的外观: H

我的网站上有一些不同的样式/模板。这些模板都用于我的网站上的作文。以下是我的文档类型示例:

Layouts (folder)
    Style 1
    Style 2
    Style 3
Products (folder)
    ProductsPage
    Product
News (folder)
    NewsOverview
    NewsPage
基本上就是这个样子。除了产品和新闻页面之外,所有这些都有模板,但它们都有样式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)
等等。你明白了吗?StyleX文档类型都是合成的,所以我不必一遍又一遍地为同一个页面设置样式,但我仍然可以创建我想要的任何页面样式

现在,关于我的父母,例如NewsOverview,我想访问孩子们的属性。在NewsOverview模板文件中,我必须执行以下操作:

@foreach(var article in Model.Content.Children) {
    dynamic image = article;
    <img src="@image.OverviewImage[0].Url" />
    <p>@article.GetPropertyValue("overviewTitle")</p>
}
基本上,如果不使用字符串或强制转换为dynamic,我无法访问属性,尽管我的模型设置为Dll,并且我通常可以使用intellisense执行Model.Content.PROPERTY等操作


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

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

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

您可能需要将子项强制转换为特定类型:

@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只获取IPPublishedContent类型的子文档,因为ModelsBuilder不知道当前页面下可以存在哪些类型的文档。

有一个名为Children的方法,它获取特定类型的所有子文档,因此可以安全地在foreach中强制转换:

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

您可能需要在article.OverviewImage.First周围添加一些逻辑,就好像OverviewImage没有值一样,它将引发空引用异常。

我不明白产品1样式2的含义。您创建了一个产品节点,该节点具有style1-2-3的所有属性,并且您只填充了style 2?@Eyescream我有一个名为style 1的doctype,它的属性与其他样式基本相同。唯一的区别是模板。我希望用户和我能够为每个页面选择要使用的模板。某些页面的文本可能比其他页面多,图像可能比其他页面多,等等。样式1只是一个带有模板的doctype,它是产品doctype的组成部分。您知道可以将多个模板分配给一个doctype,对吗?然后,当您创建一个页面时,您只需选择要使用的页面。你不需要一个新的DocType来拥有一个新的模板。如果我正确理解了您的问题,不,您不能使用来自组合doctype的多个模板。将仅使用父doctype中的模板。组合只是模型生成器上的接口。您可以非常轻松地转换子对象。内容模型仍然是IPPublishedContent。无需再次构建模型。