我最近刚刚将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无法获取任何要迭代的元素。
非常感谢任何帮助。
谢谢。
答案 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被击中。