【问题标题】:Umbraco AncestorOrSelf(int) - what does it do?Umbraco AncestorOrSelf(int) - 它有什么作用?
【发布时间】:2013-11-11 21:21:00
【问题描述】:

使用时:

@Model.AncestorOrSelf(3)

在 Umbraco 的 .cshtml 模板中,这可能会将节点遍历限制为 3 个级别。这是正确的,如果是这样,任何人都可以确认当前节点的索引是否为零?

【问题讨论】:

  • 我已经更新了我的答案,用一个例子来解释你的问题。

标签: umbraco


【解决方案1】:
@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结尾处
  • @RobScott 我在 2013 年 11 月发布了我的答案。该成员在以前的版本中可用。也许随着时间的推移它已经改变了。你用的是 V6 还是其他的?
  • 你是对的,对此感到抱歉。我在工作中一直在研究 v6,并且正在查看备忘单。 v7 确实使用单数。我很抱歉。
【解决方案2】:

添加来自 SiddharthP 的答案,我认为 OP 可能正在寻找 @CurrentPage.Up(int) 方法 - 这是从当前级别向上遍历树指定数量的级别。

因此,如果您想要当前节点的祖父 - 强类型版本的 @CurrentPage.Up(2) 或 @Model.Content.Up(2)。

可以将其想象为 Ancestor 从内容树的根向下开始,向上从您要到达根的位置开始。

我认为令人困惑的一点是您使用 CurrentPage 对象,但开始从顶部根节点向 CurrentPage 遍历。当我们想到人类中的祖先时,我们并不是从一开始就开始的!

【讨论】:

  • 我认为 v7.2 中的 Up 方法存在错误。马上报告 - 谨慎使用!
【解决方案3】:

如果我对代码的理解是正确的,.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;
}

希望我理解正确并且这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-14
    • 2019-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多