1

我有一个页面,其中有一个名为“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())
}

但我真的希望有一种更简洁的方法来做到这一点,因为我可能想在给定页面的几个地方做这件事。

4

3 回答 3

1

是的,您可以使用检查。

但是,我强烈反对这种做法,因为用户能够更改节点的名称,因此可能会破坏您的代码。

我会创建一个特殊的文档类型并使用文档类型搜索节点。有几种(快速)方法可以做到这一点:

@Umbraco.ContentByXPath("//MyDocType") // this returns a dynamic variable
@Umbraco.TypedContentSingleByXPath("//MyDocType") // this returns a typed objects
@Model.Content.Descendants("MyDocType")
// and many other ways
于 2014-02-19T16:53:25.593 回答
0

正如提到不是很好的做法。而是按类型查找节点并在代码中使用文档类型的别名。如果出于某种原因您需要一个特定的节点,不如给它一个属性并查找该属性。下面的示例代码

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
            }
        }
    }
}
于 2016-03-17T11:05:22.327 回答
0

是的,接受答案的相同想法

以下代码对我有用。

 var currentPageNode = Library.NodeById(@Model.Id);

  @if(@currentPageNode.NodeTypeAlias == "ContactMst")
   {
              <div>Display respective data...</div>
  }
于 2015-09-12T04:54:29.840 回答