答案 0 :(得分:5)
在查询中使用//
将使其递归,而/
仅为直接子项。这会对性能产生影响。
/sitecore/content/home//*[@@templatekey='site section']
此外,不应该是@@templatename
而不是@@templatekey
?
/sitecore/content/home//*[@@templatename='site section']
答案 1 :(得分:5)
var homeItem = Sitecore.Context.Database.GetItem(Sitecore.Context.Site.StartPath);
var siteSectionItems = new List<Item>();
foreach (Item item in homeItem.Children)
{
var itemTemplate = TemplateManager.GetTemplate(item);
if (itemTemplate.InheritsFrom("Site Section"))
siteSectionItems.Add(item);
}
答案 2 :(得分:0)
我建议你做的是编写逻辑来确定一个项是否实现了一个特定的模板。例如,您可以使用以下代码执行此操作:
/// <summary>
/// Determines if the item implements the specified template.
/// </summary>
/// <param name="item">The item to check.</param>
/// <param name="templateName">Name of the template.</param>
/// <returns>
/// A boolean indicating weather the item implements the template or not
/// </returns>
public static bool DoesItemImplementTemplate(Item item, string templateName)
{
if (item == null || item.Template == null)
{
return false;
}
var items = new List<TemplateItem> { item.Template };
int index = 0;
// flatten the template tree during search
while (index < items.Count)
{
// check for match
TemplateItem template = items[index];
if (template.Name == templateName)
{
return true;
}
// add base templates to the list
items.AddRange(template.BaseTemplates);
// inspect next template
index++;
}
// nothing found
return false;
}
你给它的'item'和它应该继承的模板的'templatename',你将返回一个true / false。例如,你可以得到一个List并通过foreach来过滤掉那些没有继承的项目。
List<Item> completeList = new List<Item>();
completeList = Sitecore.Context.Item.Children().toList<Item>();
List<Item> correctItemList = new List<Item>();
foreach(Item thisItem in completeList)
{
if(DoesItemImplementTemplate(thisItem, "myTemplate")
{
if(!correctItemList.Contains(thisItem)
{
correctItemList.Add(thisItem);
}
}
}
我希望你能用上述信息做些有用的东西!