Получить дочерний узел по имени в Umbraco 7.x

У меня есть страница с дочерним узлом "Виджеты". Я хочу отобразить этот дочерний шаблон в определенном разделе моего шаблона страницы. В настоящее время я делаю это:

@{
    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())
}

Но я действительно надеялся, что есть более краткий способ сделать это, так как я могу захотеть сделать это в нескольких местах на данной странице.


person Chris    schedule 18.02.2014    source источник


Ответы (3)


Да, вы можете использовать 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
person dampee    schedule 19.02.2014
comment
У меня действительно нет проблем с требованием конкретных соглашений об именах виджетов, поскольку здесь используется частный случай и для каждого сайта. Просто пытаюсь выяснить наименее подробный способ выполнить задачу. - person Chris; 19.02.2014
comment
Все еще думаю, что это не может быть менее подробным и более безопасным, чем примеры, которые я привел. Если вы хотите меньше кода в той же настройке: Model.Content.CurrentPage.First(x => x.Name == Widget).Id - person dampee; 20.02.2014
comment
Упс. CurrentPage, конечно, должен быть Childeren. При этом вы можете заменить Model.Content на CurrentPage, если хотите использовать динамический. - person dampee; 22.02.2014

Да по той же идее принятого ответа

Следующий код работал у меня.

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

  @if(@currentPageNode.NodeTypeAlias == "ContactMst")
   {
              <div>Display respective data...</div>
  }
person BJ Patel    schedule 12.09.2015

Как уже упоминалось, не очень хорошая практика. Скорее ищите узлы по их типу и используйте псевдоним типа документа в своем коде. Если по какой-либо причине вам нужен конкретный узел, скорее дайте ему свойство и найдите это свойство. Пример кода ниже

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
            }
        }
    }
}
person Francis Benyah    schedule 17.03.2016