我有一个带有ASP下拉列表的sitecore页面,表格中的数据是从下拉列表的选定值填充的。当更改下拉列表的选定项目时,将触发回发。在回发中,新选择的项目将添加到查询字符串中,并重定向用户(可链接性)。
我最近启用了HTML缓存(对于所有子布局,“Vary by querystring”),现在突然,这种机制不再有效。似乎发生的事情是我选择一个新的下拉项目,页面似乎回发(虽然如果我正在调试,我的断点都没有被击中)。之后,如果我再次更改所选项目,我可以在Firebug中看到消息“__doPostBack未定义”,这似乎意味着ASP生成的JavaScript未添加到页面中。
答案 0 :(得分:4)
启用子布局的缓存意味着您完全绕过代码,而Sitecore只是提供之前生成的相同HTML。所以它的行为与设计一致。换句话说,这似乎不是您可以利用子布局缓存的方案。
答案 1 :(得分:0)
如前所述,这是预期的行为,因为正在从缓存中提取页面。您仍然可以支持非回发加载的缓存,但我发现的最简单的方法是使用Global.asax中的代码检测回发并相应地切换,如下面的示例所示。
public override string GetVaryByCustomString(HttpContext context, string custom)
{
if (context.Request.RequestType.Equals("POST"))
{
context.Response.Cache.SetNoServerCaching();
return "POST " + DateTime.Now.Ticks + " " + context.Request.RawUrl;
}
switch (custom)
{
case "RAWURL":
return context.Request.RawUrl;
default:
return "";
}
}
然后你可以将它挂钩到控件中的输出缓存指令:
<%@ outputcache duration =“3600”varybyparam =“none”varybycustom =“RAWURL”%>
请注意,如果您这样做,您将失去通过控件的数据源轻松改变的能力。