Sitecore:打开HTML缓存会阻止Postback行为

4
我有一个使用ASP下拉列表的Sitecore页面,表单的数据由下拉列表的选择值填充。当下拉列表的选定项发生改变时,将触发一个PostBack事件。在PostBack事件中,新的选定项被添加到查询字符串中,并且用户被重定向(以便于链接)。
最近我启用了HTML缓存(对于所有子布局,“按查询字符串变化”),但突然间这个机制不再起作用了。似乎发生的是我选择了新的下拉选项后,页面似乎已经回传(尽管如果我正在调试,则没有任何断点触发)。之后,如果我再次更改选定的项目,我可以在Firebug中看到消息“__doPostBack未定义”,这似乎意味着ASP生成的JavaScript并没有被添加到页面中。
2个回答

4

启用子布局缓存意味着您完全绕过了代码,Sitecore只是提供之前生成的相同HTML。 因此,它正在按照设计的方式运行。 换句话说,在这种情况下,似乎无法利用子布局缓存功能。


那么这是否意味着在回发时您永远无法使用子布局缓存? - Ed Schwehm
参见 http://intothecore.cassidy.dk/2008/07/say-goodbye-to-sitecore-53.html 和 http://intothecore.cassidy.dk/2008/07/return-to-not-so-cacheable-control-in.html。这两个链接都是针对 Sitecore 5.3 版本的,但我有一种感觉,Sitecore 的立场是 - 这种错误行为是“设计如此”。然而,有几种方法可以解决这个问题。 - Mark Cassidy
2
这个答案是正确的。按照设计工作。你可以缓存页面的其他片段,或者如果性能仍然存在问题,重构以使用jQuery+JSON AJAX而不是postback。 - nickwesselman

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" %>

请注意,如果您以这种方式操作,就会失去根据控件数据源进行变化的简便方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接