我正在尝试为“阻止”列表和使用情况int页面创建自定义报告。因此,我需要获取所有可用的块类型列表以及页面中的用法/链接。
我尝试了下面的代码,但这需要使用Block作为输入来获取用法。
var repository = ServiceLocator.Current.GetInstance<IContentRepository>();
var contentTypeRepository = ServiceLocator.Current.GetInstance<IContentTypeRepository>();
var contentModelUsage = ServiceLocator.Current.GetInstance<IContentModelUsage>();
var myblockType = contentTypeRepository.Load<InputBlock>();
List<ContentReference> myblockTypeReferences = contentModelUsage.ListContentOfContentType(myblockType).Select(x => x.ContentLink.ToReferenceWithoutVersion()).Distinct().ToList();
InputBlock blockType;
foreach (ContentReference cref in myblockTypeReferences)
{
repository.TryGet<InputBlock>(cref, out blockType);
model.lstBlocks.Add(blockType);
}
我希望不提供输入块,并获得Episerver中可用块类型的所有列表以及页面中的用法
答案 0 :(得分:0)
如果需要获取内容类型,则可以使用IContentRespository List()方法。
要获取内容的实际实例,可以使用IContentModelUsage ListContentOfContentType方法。那将抢占所有实例。
var usages = contentModelUsage.ListContentOfContentType(contentType);
Episerver的新App Marketplace中还有一个免费的应用程序,我认为它的功能类似于您想要check it out所追求的功能。
编辑:我看到您使用Episerver 8对此进行了标记,并且该应用程序仅适用于11及更高版本,因此可能对您不起作用。
答案 1 :(得分:0)
您将需要遍历所有内容类型,然后遍历所有这些内容类型的用法。我在Epi 11中使用了以下功能
public IList<IContent> GetUnusedBlocks()
{
var contentTypeRepository = ServiceLocator.Current.GetInstance<IContentTypeRepository>();
var contentModelUsage = ServiceLocator.Current.GetInstance<IContentModelUsage>();
var contentRepository = ServiceLocator.Current.GetInstance<IContentRepository>();
var linkRepository = ServiceLocator.Current.GetInstance<IContentSoftLinkRepository>();
var unusedBlocks = new List<IContent>();
// Loop through all content types
foreach (var contentType in contentTypeRepository.List().Where(content => content.Name.ToLower().Contains("block")))
{
// Find usages of the content type in question
IList<ContentUsage> contentUsages = contentModelUsage.ListContentOfContentType(contentType);
// Get usages including versions
IList<IContent> blocks = contentUsages.Select(contentUsage =>
contentUsage.ContentLink.ToReferenceWithoutVersion())
.Distinct()
.Select(contentReference => contentRepository.Get<IContent>(contentReference))
.ToList();
// Find blocks that are being referenced
foreach (IContent block in blocks)
{
var referencingContentLinks = linkRepository.Load(block.ContentLink, true)
.Where(link =>
link.SoftLinkType == ReferenceType.PageLinkReference &&
!ContentReference.IsNullOrEmpty(link.OwnerContentLink))
.Select(link => link.OwnerContentLink);
if (!referencingContentLinks.Any())
{
unusedBlocks.Add(block);
}
}
}
return unusedBlocks;
}
参考:EpiServer - How can I find out if a block is being used on any published page?