Sitecore:打开HTML缓存阻止回发行为

时间:2010-09-02 14:38:16

标签: asp.net caching postback sitecore

我有一个带有ASP下拉列表的sitecore页面,表格中的数据是从下拉列表的选定值填充的。当更改下拉列表的选定项目时,将触发回发。在回发中,新选择的项目将添加到查询字符串中,并重定向用户(可链接性)。

我最近启用了HTML缓存(对于所有子布局,“Vary by querystring”),现在突然,这种机制不再有效。似乎发生的事情是我选择一个新的下拉项目,页面似乎回发(虽然如果我正在调试,我的断点都没有被击中)。之后,如果我再次更改所选项目,我可以在Firebug中看到消息“__doPostBack未定义”,这似乎意味着ASP生成的JavaScript未添加到页面中。

2 个答案:

答案 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”%>

请注意,如果您这样做,您将失去通过控件的数据源轻松改变的能力。