Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sitecore只需少量处理(性能)即可获取所有父级(祖先级)_Sitecore_Sitecore8_Glass Mapper - Fatal编程技术网

Sitecore只需少量处理(性能)即可获取所有父级(祖先级)

Sitecore只需少量处理(性能)即可获取所有父级(祖先级),sitecore,sitecore8,glass-mapper,Sitecore,Sitecore8,Glass Mapper,我正试图找到一个解决方案来获取上下文项的所有祖先。一个选项是将_路径存储在索引中,另一个选项类似于以下选项: 我没有得到上述(玻璃映射器)解决方案的解决方案工作的运气 我使用了索引解决方案,但希望避免使用索引只是为了获得_路径(祖先集合),因为我们没有任何其他要求来使用索引,例如搜索等 如果有人可以共享代码片段以获得工作解决方案,或者如果Glassmapper已经包含了上述博客解决方案,那么就更好了。检查一个项目是否是另一个项目的后代的最有效方法是只需检查当前项目属性路径。LongID以父项目

我正试图找到一个解决方案来获取上下文项的所有祖先。一个选项是将_路径存储在索引中,另一个选项类似于以下选项:

我没有得到上述(玻璃映射器)解决方案的解决方案工作的运气

我使用了索引解决方案,但希望避免使用索引只是为了获得_路径(祖先集合),因为我们没有任何其他要求来使用索引,例如搜索等


如果有人可以共享代码片段以获得工作解决方案,或者如果Glassmapper已经包含了上述博客解决方案,那么就更好了。

检查一个项目是否是另一个项目的后代的最有效方法是只需检查当前项目属性
路径。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 
}
然后从您的代码中,您可以简单地检查:

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 
}
Item currentItem=Sitecore.Context.Item//或者使用SitecoreContext()获取强类型模型
IEnumerable menuItems=GetMenuItems();
foreach(菜单项中的变量菜单项)
{
bool isActive=currentItem.path.FullPath.StartsWith(menuItem.FullPath);
//执行代码
}

警告一句,因为现在每个菜单项都需要运行代码来确定状态,这将使菜单组件难以缓存,从而导致缓存过多的变体或每页缓存。您最好将此逻辑移动到Javascript中,使用当前页面URL设置菜单状态,这将允许对所有页面缓存一次组件。

Glass中不包含博客中的解决方案,但如果需要,提供代码供您实现。当您说“获取一个项目的所有祖先”时,您实际上是想获取所有项目(例如,一个项目列表),还是只是为了比较目的而获取路径?只是为了确定菜单活动状态的祖先Id,谢谢。
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 
}