使用DescendantsOrSelf进行迭代的问题

时间:2014-11-26 17:53:59

标签: razor umbraco umbraco7

我最近刚刚将Umbraco从4.7.2升级到7.1.9,现在正在将所有遗留宏记录缓慢转换为部分视图宏。当使用DescendantsOrSelf迭代节点时,我遇到了一些问题。

我有一个宏为我的网站(内联网)生成侧边菜单。在版本4中,宏在整个站点上按预期工作,在主页上显示相应的菜单,在子页面上显示不同的侧面菜单。

升级后的以下条件:

var model = GetParentSideMenu(CurrentPage);

@if (CurrentPage.AncestorsOrSelf("umbSomePageType").Where("Visible").First().HasValue("PageName") && CurrentPage.AncestorsOrSelf("umbSomePageType").Where("Visible").First().Id != model.Id)
{ ... }

@functions
{
public dynamic GetParentSideMenu(dynamic model)
{
    if (model.Level > 1)
    {
        do
        {
            if (model.umbSideMenuLinks.Count() > 0)
            {
                return model;
            }
            if (model.Level > 1) {
                model = model.Up();
            } else { break; }
        } while (model.Up() != null);

        return model;
    }
     else return model;
   }
}

在主页上呈现时生成以下错误:

System.InvalidOperationException {"Sequence contains no elements"}

Inner Exception is null

这里的理解是正在呈现的页面不是" umbSomePageType"所以这个条件应该是假的并继续前进,但它会引发上述异常。

在" umbSomePageType"上渲染时,宏工作正常。页面,但允许用户在" umbSomePageType"下的其他类型的其他子页面。我必须手动检查" DocumentTypeAlias"并确保没有执行检查该类型子页面的其他if语句,因为我得到与上面相同的错误。

我面临的另一个问题是,在v4中使用之前,它没有返回可迭代的集合:

@if (model.DescendantsOrSelf("umbSideMenuLinks").Where("Visible").Count() > 0)
{
    foreach (var item in model.DescendantsOrSelf("umbSideMenuLinks").Where("Visible").First().Children)
{ ... } 
.... }

if条件返回true但foreach无法获取任何要迭代的元素。

非常感谢任何帮助。

谢谢。

1 个答案:

答案 0 :(得分:0)

我能够找到上面指定的第一个问题的解决方案。由于“CurrentPage”是动态对象,因此在“if”条件中发生错误,需要使用“FirstOrDefault()”而不是“First()”。

如果您有以下目录结构,第二个问题仍然存在,并进一步详细说明该问题:

Root Folder/Homepage
- Second Level Folder
-- SideMenuLinks (umbSideMenuLinks)
-- SomePage...
- SideMenuLinks (umbSideMenuLinks)

在上述情况下如果我在“HomePage”上并且我想呈现与主页相关的“SideMenuLinks”并且我使用“DecedantOrSelf”它将从根文件夹转到第二级文件夹并且到“ SideMenuLinks“而不是先检查它”Self“这是我想要的行为。这在Umbraco v4中有效,但在v7中它首先钻入子目录。 也许如果我重新排序/排序SideMenuLinks,使它们出现在“二级文件夹”之前? 还没有尝试过。

更新:所以我只是尝试了排序,如果我按照这种方式对树进行排序:

Root Folder/Homepage
- SideMenuLinks (umbSideMenuLinks)
- Second Level Folder
-- SideMenuLinks (umbSideMenuLinks)
-- SomePage... 

它开始起作用了。将来我们必须创建页面结构,以确保正确的SideMenuLink被击中。