在 Umbraco 7.x 中按名称获取子节点



我有一个页面,其中包含一个名为"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
            }
        }
    }
}

相关内容

  • 没有找到相关文章

最新更新