【发布时间】:2013-11-11 21:21:00
【问题描述】:
使用时:
@Model.AncestorOrSelf(3)
在 Umbraco 的 .cshtml 模板中,这可能会将节点遍历限制为 3 个级别。这是正确的,如果是这样,任何人都可以确认当前节点的索引是否为零?
【问题讨论】:
-
我已经更新了我的答案,用一个例子来解释你的问题。
标签: umbraco
使用时:
@Model.AncestorOrSelf(3)
在 Umbraco 的 .cshtml 模板中,这可能会将节点遍历限制为 3 个级别。这是正确的,如果是这样,任何人都可以确认当前节点的索引是否为零?
【问题讨论】:
标签: umbraco
@Model.AncestorOrSelf(3)
Model.Content 是我们当前所在的页面。 AncestorsOrSelf 就是全部 此页面在树中的祖先。 (level) 意思是:上升到 级别 1/2/3/... 并停止寻找更多的祖先,当你得到 在那里。
以上是您对 Umbraco 7.x rc 版本的评论。
以下面的内容树为例,它类似于您通常在 umbraco 管理区域的内容部分中看到的内容:
每个内容文档都有一个级别,默认情况下它以 1 开头。
在 Umbraco 的 .cshtml 模板中,这可能会限制节点 遍历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>
根据我们的例子,它会给你:
关于我们、联系我们、新闻区(以列表形式和适当的链接)
【讨论】:
Ancestor(),实际上是Ancestors() 或AncestorsOrSelf(),等等——注意“s”在Ancestor结尾处
添加来自 SiddharthP 的答案,我认为 OP 可能正在寻找 @CurrentPage.Up(int) 方法 - 这是从当前级别向上遍历树指定数量的级别。
因此,如果您想要当前节点的祖父 - 强类型版本的 @CurrentPage.Up(2) 或 @Model.Content.Up(2)。
可以将其想象为 Ancestor 从内容树的根向下开始,向上从您要到达根的位置开始。
我认为令人困惑的一点是您使用 CurrentPage 对象,但开始从顶部根节点向 CurrentPage 遍历。当我们想到人类中的祖先时,我们并不是从一开始就开始的!
【讨论】:
如果我对代码的理解是正确的,.AncestorOrSelf(int) 在参数中返回节点在给定级别的祖先(或自我)。
取自 https://github.com/umbraco/Umbraco-CMS/blob/6.2.0/src/umbraco.MacroEngines/RazorDynamicNode/DynamicNode.cs 的第 948 和 956 行
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;
}
希望我理解正确并且这会有所帮助。
【讨论】: