【问题标题】:Sitecore: Turning on HTML Caching blocks postback behaviorSitecore:打开 HTML 缓存会阻止回发行为
【发布时间】:2011-04-07 09:22:31
【问题描述】:

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

我最近启用了 HTML 缓存(对于所有子布局,“根据查询字符串变化”),现在突然之间,这种机制不再起作用。似乎发生的事情是我选择了一个新的下拉项,页面似乎回发(尽管如果我正在调试,我的断点都不会被命中)。之后,如果我再次更改所选项目,我可以在 Firebug 中看到消息“__doPostBack is not defined”,这似乎意味着 ASP 生成的 JavaScript 没有被添加到页面中。

【问题讨论】:

    标签: asp.net caching postback sitecore


    【解决方案1】:

    为子布局启用缓存意味着您完全绕过了代码,Sitecore 只是提供之前生成的相同 HTML。所以它的行为符合设计。换句话说,这似乎不是您可以利用子布局缓存的场景。

    【讨论】:

    • 这是否意味着您永远不能在回发的地方使用子布局缓存?
    • intothecore.cassidy.dk/2008/07/say-goodbye-to-sitecore-53.htmlintothecore.cassidy.dk/2008/07/…。两者都特定于 5.3 版,但我感觉 Sitecore 的立场是 - 这种错误行为是“设计使然”。但是,有几种方法可以使用它。
    • 这个答案是正确的。按设计工作。您也许可以缓存页面的其他片段,或者如果性能仍然存在问题,请重构以使用 jQuery+JSON AJAX 而不是回发。
    【解决方案2】:

    如前所述,这是预期行为,因为该页面是从缓存中获取的。您仍然可以支持对非回发加载进行缓存,但我发现最简单的方法是使用 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 "";
            }
        }
    
    

    然后你可以在你的控件中使用它来输出缓存指令:

    请注意,如果这样做,您将无法轻松地根据控件的数据源进行更改。

    【讨论】:

      猜你喜欢
      • 2023-03-31
      • 1970-01-01
      • 2015-12-01
      • 2015-08-20
      • 2016-08-19
      • 1970-01-01
      • 1970-01-01
      • 2012-05-19
      • 1970-01-01
      相关资源
      最近更新 更多