Umbraco AncestorOrSelf (int) - что он делает?

При использовании:

@Model.AncestorOrSelf(3)

В шаблоне .cshtml в Umbraco это предположительно ограничивает обход node до 3 уровней. Правильно ли это, и если да, то может ли кто-нибудь также подтвердить, имеет ли текущий node нулевой индекс?

Ответ 1

@Model.AncestorOrSelf(3)

Model.Content - это текущая страница, на которой мы находимся. AncestorsOrSelf - все предков, которые эта страница имеет в дереве. (уровень) означает: перейдите к уровень 1/2/3/... и перестаньте искать новых предков, когда вы есть.

Выше комментарий, который вы получаете с версией Umbraco 7.x rc.

Возьмем пример дерева контента ниже, похожего на то, которое вы обычно видите в разделе содержимого в области администрирования umbraco:

Каждый контентный документ имеет уровень и по умолчанию он начинается с 1.

В шаблоне .cshtml в Umbraco это предположительно ограничит nodeобход к 3 уровням

Как вы можете видеть в приведенном ниже примере, уровень увеличивается на уровне уровня + 1. Таким образом, он начинается с 1, а затем просто добавляет 1 к вашим дополнительным уровням.

- Content
 -- Home (level = 1)
   -- About Us (level = 2)
   -- Contact Us (level = 2)
   -- News Area (level = 2)
     -- News Item 1 (level = 3)
     -- News Item 2 (level = 3)
 -- Other Node (level = 1)

Поэтому, когда вы указываете 3 как параметр для AncestorOrSelf, вы просите перейти на 3-й уровень в дереве из текущего элемента, который может быть любым документом/частичным представлением, и прекратить поиск каких-либо других предков при его обнаружении.

AncestorOrSelf(level) возвращает один элемент, который если типа DynamicPublishContent, то у вас будет доступ ко многим свойствам, таким как id, name, url и т.д.

@CurrentPage.AncestorOrSelf(1)
// based on content structure above, the above statement will give you an item - Home.

Это в основном для извлечения предков по уровню, не имеет значения, каков ваш текущий уровень или текущий объект.

Например, если вы хотите создать навигацию в своем основном макете, чтобы поделиться ею со всеми страницами вашего сайта, вы сделаете что-то вроде этого в своем шаблоне:

<ul>
 @foreach(var page in @CurrentPage.AncestorOrSelf(1).Children)
 {
   <li><a href="@page.Url">@page.Name</a></li>
 }
</ul>

На основе нашего примера он даст вам:

О нас, Связаться с нами, Область новостей (в виде списка и с соответствующими ссылками)

Ответ 2

Добавление к ответу от SiddharthP Я думаю, что OP, возможно, ищет метод @CurrentPage.Up(int) - это пересекает дерево с текущего уровня на указанное количество уровней.

Итак, если вы хотите дедушку текущего node - @CurrentPage.Up(2) или @Model.Content.Up(2) для строго типизированной версии.

Подумайте об этом, поскольку Ancestor начинается с корня дерева контента вниз, а Up начинается с того, куда вы направляетесь к корню.

Я думаю, что запутанный бит заключается в том, что вы используете объект CurrentPage, но начинаете переход от верхнего корня node к CurrentPage. Когда мы думаем о наших предках в человечестве, мы начинаем не с самого начала!

Ответ 3

Если мое понимание кода верное,.AncestorOrSelf(int) возвращает в свой аргумент предка (или себя) node на заданном уровне.

Взято из строк 948 и 956 https://github.com/umbraco/Umbraco-CMS/blob/6.2.0/src/umbraco.MacroEngines/RazorDynamicNode/DynamicNode.cs

public DynamicNode AncestorOrSelf(int level)
{
    return AncestorOrSelf(node => node.Level == level);
}

public DynamicNode AncestorOrSelf(Func<DynamicNode, bool> func)
{
    if (func(this)) return this;

    var content = this;
    while (content.Level > 1) // while we have a parent, consider the parent
    {
        // see note in .Parent - strange things can happen
        var parent = content.Parent;
        if (parent == content) return null;
        content = parent;

        if (func(content))
            return content;
    }

    return null;
}

Надеюсь, я понял это правильно и что это помогает.