我的网站上有一些不同的样式/模板。这些模板都用于我网站上的合成。这是我的文档类型的一个例子:
Layouts (folder)
Style 1
Style 2
Style 3
Products (folder)
ProductsPage
Product
News (folder)
NewsOverview
NewsPage
这基本上就是它的样子。除了Product
和NewsPage
之外,所有这些模板都有模板,但它们有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
等等。
我怎样才能做到这一点?如何在不使用动态的情况下访问属性?我知道孩子们不一定都是一样的,但我所有风格的页面都包含相同的属性,它们在模板中的排列方式不同。
答案 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不知道当前页面下可以存在哪些类型的文档。