我的网站上有一些不同的样式/模板。这些模板都用于我网站上的作文。以下是我的文档类型示例:
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
我怎样才能做到这一点?如何在不使用动态的情况下访问属性?我知道孩子们不一定都一样,但我所有样式的页面都包含相同的属性,只是在模板中排列不同。
有一个名为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
没有值一样,它会抛出一个null引用异常。
您是否已将父模型添加到模板中?:
@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()
只得到IPublishedContent
类型的子级,因为ModelsBuilder不知道当前页面下可以存在哪些类型的文档。