Razor 使用后代或自身进行迭代时出现问题

Razor 使用后代或自身进行迭代时出现问题,razor,umbraco,umbraco7,Razor,Umbraco,Umbraco7,我最近刚刚将Umbraco从4.7.2升级到7.1.9,现在正在缓慢地将所有旧的宏脚本转换为部分视图宏。在使用DegenantSorself遍历节点时,我遇到了一些问题 我有一个宏,可以为我的站点(intranet)生成侧菜单。在版本4中,宏在整个站点上按预期工作,在主页上显示相应的菜单,在子页面上显示不同的侧菜单 升级后,应满足以下条件: var model = GetParentSideMenu(CurrentPage); @if (CurrentPage.AncestorsOrSelf(

我最近刚刚将Umbraco从4.7.2升级到7.1.9,现在正在缓慢地将所有旧的宏脚本转换为部分视图宏。在使用DegenantSorself遍历节点时,我遇到了一些问题

我有一个宏,可以为我的站点(intranet)生成侧菜单。在版本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”,因此该条件应该为false并继续,但它会引发上述异常

在“umbSomePageType”页面上呈现宏时,宏可以正常工作,但由于允许用户在“umbSomePageType”下拥有其他类型的子页面,我必须手动检查“DocumentTypeAlias”,并确保没有执行检查该类型子页面的其他if语句,因为我遇到了与上述相同的错误

我面临的另一个问题是,它在v4中以前使用时不会返回iterable集合:

@if (model.DescendantsOrSelf("umbSideMenuLinks").Where("Visible").Count() > 0)
{
    foreach (var item in model.DescendantsOrSelf("umbSideMenuLinks").Where("Visible").First().Children)
{ ... } 
.... }
if条件返回true,但foreach无法获取任何元素进行迭代

这里的任何帮助都将不胜感激


谢谢。

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

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

Root Folder/Homepage
- Second Level Folder
-- SideMenuLinks (umbSideMenuLinks)
-- SomePage...
- SideMenuLinks (umbSideMenuLinks)
在上述情况下,如果我在“主页”上,并且我想呈现与主页相关的“SideMenuLinks”,并且我使用“DecedantOrSelf”,它将从根文件夹转到第二级文件夹并转到“SideMenuLinks”,而不是首先检查“Self”,这是我想要的行为。这在Umbraco v4中起作用,但在v7中,它首先深入到子目录中。 也许如果我对侧菜单进行重新排序,使它们出现在“第二级文件夹”之前? 我还没试过

更新:所以我只是尝试了排序,如果我这样对树排序:

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

它开始工作了。将来,我们必须创建此页面结构,以确保命中正确的侧菜单链接。

您是否知道在GetParentSideMenu中发生InvalidOperationException的位置?对于您的第二个问题,我遇到了类似的问题,除了调用之外,我还通过检查if not null对其进行了更正。嘿,对不起,我应该指定它。错误发生在if条件下。将First()替换为FirstOrDefault()解决了这个问题。很好,很高兴您解决了这个问题。可能会发布最终解决方案,如果可能的话,将其标记为已解决。对于第二个问题,在调试了一段时间后,我意识到在旧版本中,当使用“后代或自我”时,会首先检查自我,然后检查后代。在v7中,它首先检查死者,碰巧它找到的第一个后代有一个“umbSideMenuLink”文档类型,但里面没有内容,因此不返回任何内容。我假设这是在v7中改变的东西?是的,我明天会这样做。谢谢你的信息,我不知道有什么变化。我将不得不看一看我使用“后代”或“自身”来验证一切是否正常的一些例程。