我正在尝试为获取上下文项目的所有祖先提出解决方案。一个选项是将_path存储在索引中,其他选项与下面的选项类似: http://www.glass.lu/Blog/GettingAncestors
我没有运气让解决方案适用于上述(玻璃映射器)解决方案。
我得到了索引解决方案,但是我想避免使用索引来获取_path(祖先的集合),因为我们没有任何其他要求来使用索引,例如搜索等。
欣赏是否有人可以共享工作解决方案的代码段,如果Glassmapper已经包含上述博客解决方案,则会更好。
答案 0 :(得分:6)
检查一个项目是否是另一个项目的后代的最有效方法是简单地检查当前项目属性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设置菜单状态,这将允许您的组件为所有页面缓存一次。