我正在试图找出通过Sitecore角色缓存html的最佳方法。我正在考虑使用VaryByParam,但我没有静态绑定我的渲染。它们都动态添加到页面中。我正在使用Web表单,任何帮助将不胜感激
答案 0 :(得分:2)
所以我最终使用了你的部分解决方案Jan.我正在添加一个答案,因为它并不像启用Vary By Param那么容易。
首先,我必须实现RoleManager
public class RoleManager
{
private User currentUser;
public string GetReadRole(Item item)
{
currentUser = Sitecore.Context.User;
//int found = 0;
foreach (Role role in currentUser.Roles)
{
return role.LocalName; //return the role they are in
}
return "";
}
}
然后我必须创建一个继承自Sitecore.Web.UI.WebControls.Sublayout的子布局来替换sitecore中的默认子布局。
protected RoleManager roleManager = new RoleManager();
public override string GetCacheKey()
{
Sitecore.Sites.SiteContext site = Sitecore.Context.Site;
if ((Cacheable && ((site == null) || site.CacheHtml)) && !SkipCaching())
{
if (VaryByParm)
{
return base.GetCacheKey() + "_#userRole:" + roleManager.GetReadRole(this.GetItem());
}
return base.GetCacheKey();
}
return string.Empty;
}
现在剩下要做的就是添加一个子布局渲染来替换渲染管道调用。这个类继承自Sitecore.Web.UI.SublayoutRenderingType
public override System.Web.UI.Control GetControl(NameValueCollection parameters, bool assert)
{
var sublayout = new RoleSublayout();
foreach (string key in parameters.Keys)
{
ReflectionUtil.SetProperty(sublayout, key, parameters[key]);
}
return sublayout;
}
现在所有代码都已完成,只需添加到web.config即可 修改的行是
<control template="sublayout" type="Sitecore.Web.UI.SublayoutRenderingType, Sitecore.Kernel" propertyMap="Path=path" />
现在它已经
了<control template="sublayout" type="YOURNAMESPACE.RoleSublayoutRenderingType, DLLNAME" propertyMap="Path=path" />
编辑: 为此,您需要在sitecore中启用VeryByParam
这篇文章对我有所帮助 http://sitecoreblog.alexshyba.com/sitecore_output_caching_kick_it_up_a_notch/
答案 1 :(得分:1)
Sitecore html缓存的“Vary By Parm”用于渲染参数。根据您的代码依赖性,您可以选择正确的varBy缓存参数
请参阅:
creating-sitecore-sublayouts-dynamically
有时,如果默认HTML缓存与您的逻辑不匹配,您可以使用自定义Sitecore缓存来处理重件或创建自己的“var By”请参阅Sitecore Custom Cache