我有一个页面,其中包含一个名为"Widgets"的子节点。我想在我的页面模板的某个部分呈现该孩子的模板。目前,我这样做:
@{
foreach (var child in CurrentPage.Children)
{
if (child.Name == "Widgets")
{
@Umbraco.RenderTemplate(child.Id)
}
}
}
有没有办法避免像这样循环孩子?
我还发现我可以做到这一点:
@{
@Umbraco.RenderTemplate(
Model.Content.Children
.Where(x => x.Name == "Widgets")
.Select(x => x.Id)
.FirstOrDefault())
}
但我真的希望有一种更简洁的方法可以做到这一点,因为我可能想在给定页面上的几个地方做到这一点。
是的,您可以使用 Examine。
但是,我强烈反对这种做法,因为用户能够更改节点的名称,从而可能会破坏您的代码。
我将创建一个特殊的文档类型并使用文档类型搜索节点。 有几种(快速)方法可以做到这一点:
@Umbraco.ContentByXPath("//MyDocType") // this returns a dynamic variable
@Umbraco.TypedContentSingleByXPath("//MyDocType") // this returns a typed objects
@Model.Content.Descendants("MyDocType")
// and many other ways
接受答案的想法
以下代码对我有用。
var currentPageNode = Library.NodeById(@Model.Id);
@if(@currentPageNode.NodeTypeAlias == "ContactMst")
{
<div>Display respective data...</div>
}
提到不是好的做法。而是按节点类型查找节点,并在代码中使用文档类型的别名。如果出于某种原因您需要一个特定的节点,而是给它一个属性并查找该属性。下面的示例代码
if (Model.Content.Children.Any())
{
if (Model.Content.Children.Where(x => x.DocumentTypeAlias.Equals("aliasOfCorrespondingDocumentType")).Any())
{
// gives you the child nodes underneath the current page of particular document type with alias "aliasOfCorrespondingDocumentType"
IEnumerable<IPublishedContent> childNodes = Model.Content.Children.Where(x => x.DocumentTypeAlias.Equals("aliasOfCorrespondingDocumentType"));
foreach (IPublishedContent childNode in childNodes)
{
// check if this child node has your property
if (childNode.HasValue("aliasOfYourProperty"))
{
// get the property value
string myProp = childNode.aliasOfYourProperty.ToString();
// continue what you need to do
}
}
}
}