Sitecore 以很少的处理(性能)获得所有父级(祖先)

Sitecore get all parent (ancestor) with little processing (performance)

我正在努力想出解决方案来获取上下文项的所有祖先。一种选择是将 _path 存储在索引中,另一种选择是执行与以下类似的操作: http://www.glass.lu/Blog/GettingAncestors

我没有找到上述(玻璃映射器)解决方案的解决方案。

我得到了索引解决方案,但我想避免使用索引来获取 _path(祖先集合),因为我们没有任何其他使用索引的要求,例如搜索等

感谢有人可以分享工作解决方案的片段,或者如果 Glassmapper 已经包含上述博客解决方案则更好。

检查一项是否是另一项的后代的最有效方法是简单地检查当前项 属性 Paths.LongID 是否以父项的 LongID 开头:

Item currentItem = Sitecore.Context.Item;
IList<Item> menuItems = GetMenuItems();

foreach (var menuItem in menuItems)
{
    bool isActive = currentItem.Paths.LongID.StartsWith(menuItem.Paths.LongID);

    // do code 
}

这将起作用,因为每个项目的路径 GUID 都是唯一的。

或者,如果您只想使用 Glass 模型,则可以使用 SitecoreInfoType.FullPath 属性:

[SitecoreInfo(SitecoreInfoType.FullPath)]
public virtual string FullPath { get; private set; }

然后从您的代码中您可以简单地检查:

Item currentItem = Sitecore.Context.Item; //or use SitecoreContext() to get a strongly types model
IEnumerable<MenuItem> menuItems = GetMenuItems();

foreach (var menuItem in menuItems)
{
    bool isActive = currentItem.Paths.FullPath.StartsWith(menuItem.FullPath);

    // do code 
}

请注意,由于现在每个菜单项都需要 运行 的代码才能确定状态,这将使您的菜单组件难以缓存,从而导致缓存太多变体或每页缓存。您最好将此逻辑移动到 Javascript 以使用当前页面 URL 设置菜单状态,这将允许您的组件为所有页面缓存一次。