处理用户返回到在 asp.net 应用程序中缓存项目的页面的最佳方法是什么?有没有一种捕捉后退按钮(事件?)并以这种方式处理缓存的好方法?
5 回答
如果有帮助,您可以尝试使用HttpResponse.Cache 属性:
Response.Cache.SetExpires(DateTime.Now.AddSeconds(60));
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetValidUntilExpires(false);
Response.Cache.VaryByParams["Category"] = true;
if (Response.Cache.VaryByParams["Category"])
{
//...
}
或者可以使用HttpResponse.CacheControl完全阻止页面缓存,但不推荐使用上面的 Cache 属性:
Response.CacheControl = "No-Cache";
编辑:或者您真的可以发疯并手动完成所有操作:
Response.ClearHeaders();
Response.AppendHeader("Cache-Control", "no-cache"); //HTTP 1.1
Response.AppendHeader("Cache-Control", "private"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "no-store"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "must-revalidate"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "max-stale=0"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "post-check=0"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "pre-check=0"); // HTTP 1.1
Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.1
Response.AppendHeader("Keep-Alive", "timeout=3, max=993"); // HTTP 1.1
Response.AppendHeader("Expires", "Mon, 26 Jul 1997 05:00:00 GMT"); // HTTP 1.1
据我所知(或至少已阅读)最好不要响应用户事件,而是“在页面中”思考。
构建您的应用程序,使其不在乎是否按下后退按钮。它只会处理它。从开发的角度来看,这可能意味着一些额外的工作,但总体而言将使应用程序更加健壮。 .
即,如果步骤 3 执行了一些数据更改,则用户单击返回(到步骤 2)并再次单击下一步,然后应用程序检查是否已进行更改。或者理想情况下,它不会进行任何硬更改,直到用户最后单击“确定”.. 这样,所有更改都将被存储,您可以根据之前输入的加载值重新填充表单,每次..
我希望这是有道理的 :)
RFC 2616 §13.13说History 和 Cache 是不同的东西。缓存应该绝对没有办法影响后退按钮。
如果 HTTP 标头的任何组合影响了后退按钮,则它是浏览器中的一个错误……除了一个例外。
在 HTTP S浏览器中,当使用后退按钮时,浏览器会解释Cache-control: must-revalidate
为刷新页面的请求(Mozilla 称之为“愚蠢的银行模式”)。这在纯 HTTP 中不受支持。
处理它的最佳方法可能是在您的 ASP.NET 页面(或者如果您正在使用母版页)中放置一个 no-cache 指令。我认为没有办法直接在您的 ASP.NET 代码中处理这个问题(因为缓存决定发生在客户端上)。
至于 MVC,不知道如何实现(假设它不同于基于 Web 窗体的 ASP.NET);我没用过。
以下代码在 IE9+、FF21 和最新的 Chrome 中对我有用:
Response.Cache.SetCacheability(HttpCacheability.NoCache | HttpCacheability.Private);
Response.Cache.AppendCacheExtension("must-revalidate");
Response.Cache.AppendCacheExtension("max-age=0");
Response.Cache.SetNoStore();
您可以将其放置Page_Load()
在 MasterPage 中的事件处理程序中,以便您的应用程序中的每个页面在按下后退按钮时都需要往返于服务器。