加载Kentico 10网络节点的最佳方法,包括缓存和权限检查

我有一个自定义产品类型,显示在自定义列表Web部件中。由于性能方面的原因,我试图缓存项目,但检查用户权限也很重要,因为并非所有用户都能看到所有产品。加载Kentico 10网络节点的最佳方法,包括缓存和权限检查

private static IList<TreeNode> GetUniqueProducts(string clientId, string path) 

{

var pages = CacheHelper.Cache(cs => GetProducts(cs, path), new CacheSettings(10, "cus|" + clientId));

return GetUniqueProductNamesItems(pages);

}

private static IList<TreeNode> GetProducts(CacheSettings cacheSettings, string rootPath)

{

var pages = DocumentHelper.GetDocuments().Types("CUS.Product")

.Path(rootPath, PathTypeEnum.Children)

.Published().CheckPermissions().ToList();

if (cacheSettings.Cached)

{

cacheSettings.CacheDependency = CacheHelper.GetCacheDependency("nodes|custom|cus.product|all");

}

return pages;

}

但是我意识到这是缓存第一个用户的产品列表。实际上,我想将完整的产品列表存储在缓存中,但在显示之前请检查权限。

检查权限的唯一方法似乎是按照上面的DocumentQuery的一部分 - 但我不知道如何将其应用于缓存的产品列表或单个节点上。

那么有没有一种很好的方法来实现我想要的?无需遍历每个节点并单独检查用户是否有权访问该节点?

回答:

您错过了代码中的缓存部分,我并不确定您的缓存依赖关系。

var pages = CacheHelper.Cache(cs => 

{

var result = CMS.DocumentEngine.DocumentHelper.GetDocuments().Types("CUS.Product").Path(rooPath, CMS.DocumentEngine.PathTypeEnum.Children).Published().ToList();

if (cs.Cached) { cs.CacheDependency = CacheHelper.GetCacheDependency("cus.product|all"); }

return result;

},

new CacheSettings(CacheHelper.CacheMinutes(CurrentSite.SiteName), "custom_products"));

如果您检查用户读取权限,这意味着您有点缓存每个用户。然后你的缓存应该完成每个用户,即cachename应该是“custom_products”+ UserID.ToString()或类似的东西。

以上是 加载Kentico 10网络节点的最佳方法,包括缓存和权限检查 的全部内容, 来源链接: utcz.com/qa/261227.html

回到顶部