在Sitecore中自定义子布局缓存

时间:2011-04-14 16:21:49

标签: asp.net caching user-controls sitecore

在Sitecore中使用WebControl时,有一种自定义缓存行为的方法 - 覆盖 GetCachingID 方法。 有没有办法通过Sublayouts(UserControls)实现这样的目标?我想添加自定义“VaryBy”选项(例如“Vary By Moon Position”)。

1 个答案:

答案 0 :(得分:4)

是的,默认情况下,子布局缓存可能会有多种不同的标准。您可以利用不同的参数来执行此操作。变化的是:

  • 按数据改变
  • 按设备改变
  • 通过登录发送
  • 通过参数改变
  • 通过查询字符串改变
  • 由用户改变

您在此处进行自定义的方法是参数变化,您可以定义参数。您可以在演示文稿详细信息中执行此操作,其中您可以动态地将子布局分配给项目(控件属性底部有一个部分用于定义参数),或者您可以通过C#代码进行设置。这里有一个使用C#代码静态地将子布局分配到我的布局中的示例:

<h1>My website</h1>
<h2>My site is great</h2>
<sc:Sublayout ID="slMyControl" path="~/path/to/my/control.ascx" VaryByParm="true" Cachable="true" runat="server" />

(在上面的代码中需要注意的一点是,在Sitecore中,VaryByParam的属性实际上是VaryByParm,这显然是他们代码中的拼写错误。)

现在在C#中,以编程方式设置参数:

slMyControl.Parameters = "myKey1=MyVal1&myKey2=myVal2";

如果您可以在C#中获得月球位置,则将其转换为字符串并将其分配给参数:

slMyControl.Parameters = "position=" + getMoonPosition().ToString();

我最近根据查询字符串中显示的月份和年份缓存了日历。没有错误处理的简单示例:

slEventCalendar.Parameters = string.Format("m={0}&y={1}", Request.QueryString["m"], Request.QueryString["y"]);

您最终得到的参数字符串最终成为实际缓存键的一部分。将此与其他选项进行耦合会因选项而异,只需使用更多条件生成更复杂的缓存键,从而实现更多缓存实例。一般规则是,按照您需要的最少量标准进行缓存,这将导致该缓存实例的最大使用量。