При использовании:
@Model.AncestorOrSelf(3)
В шаблоне .cshtml в Umbraco это предположительно ограничивает обход node до 3 уровней. Правильно ли это, и если да, то может ли кто-нибудь также подтвердить, имеет ли текущий node нулевой индекс?
При использовании:
@Model.AncestorOrSelf(3)
В шаблоне .cshtml в Umbraco это предположительно ограничивает обход node до 3 уровней. Правильно ли это, и если да, то может ли кто-нибудь также подтвердить, имеет ли текущий node нулевой индекс?
@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>
На основе нашего примера он даст вам:
О нас, Связаться с нами, Область новостей (в виде списка и с соответствующими ссылками)
Добавление к ответу от SiddharthP Я думаю, что OP, возможно, ищет метод @CurrentPage.Up(int) - это пересекает дерево с текущего уровня на указанное количество уровней.
Итак, если вы хотите дедушку текущего node - @CurrentPage.Up(2) или @Model.Content.Up(2) для строго типизированной версии.
Подумайте об этом, поскольку Ancestor начинается с корня дерева контента вниз, а Up начинается с того, куда вы направляетесь к корню.
Я думаю, что запутанный бит заключается в том, что вы используете объект CurrentPage, но начинаете переход от верхнего корня node к CurrentPage. Когда мы думаем о наших предках в человечестве, мы начинаем не с самого начала!
Если мое понимание кода верное,.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;
}
Надеюсь, я понял это правильно и что это помогает.