考虑以下场景:
我访问了一个使用 ASP.NET 构建的网站的页面。该页面是一个简单的 aspx 页面,其中包含 ASP.NET 服务器控件。
我单击了一个链接,该链接将我带到同一网站上的其他页面。
我点击BACK了浏览器的按钮。
问题:在页面生命周期方面会发生什么?是所有事件都发生了,还是浏览器只显示页面的缓存版本而不发出任何请求?
考虑以下场景:
我访问了一个使用 ASP.NET 构建的网站的页面。该页面是一个简单的 aspx 页面,其中包含 ASP.NET 服务器控件。
我单击了一个链接,该链接将我带到同一网站上的其他页面。
我点击BACK了浏览器的按钮。
问题:在页面生命周期方面会发生什么?是所有事件都发生了,还是浏览器只显示页面的缓存版本而不发出任何请求?
我认为最好的答案是:这取决于浏览器,尤其是在发布/回发之后。
旧版浏览器会弹出一个确认对话框,大意是“该页面包含将重新提交的 POST 数据”,您可以继续(重新提交)或取消。由于在 ASP.NET WebForms 中发生的一切都是FORM
元素的一部分(ViewState、事件等),这将导致整个生命周期重复。
当然,这给重复提交带来了无穷无尽的麻烦,因此许多网站不得不想出解决重复问题的方法,而今天大多数浏览器只是从缓存中获取页面。
...除非您覆盖缓存控制标头并强制浏览器不要将页面存储在缓存中。显然,在这种情况下,它无法从缓存中检索,因此通常最终会被重新提交。但是,同样,它取决于浏览器 - 例如,某些浏览器不允许通过 SSL 重新提交,所以如果这是正在使用的协议,那么用户只会看到一条消息,说页面已过期/不能显示。
想一想,可能一个更好的答案是:作为一个网站设计者,当点击返回按钮时,你真的不能依赖用户浏览器的任何特定行为。如果重复提交可能会产生负面影响(例如两次向信用卡收取费用),那么您需要采取足够的措施来防止这种情况发生。无论如何,这是一种很好的做法,因为用户完全有可能不小心双击“提交”按钮。
我们甚至尝试过
Response.ExpiresAbsolute = DateTime.Parse("1/1/1980");
Response.AddHeader("cache-control", "no-store, must-revalidate, private");
Response.AddHeader("Pragma", "no-cache");
解决这类问题
通常所有事件都应该发生,但如果你有一个超级浏览器,它可能会显示一个缓存页面,你可以在页面加载中放置一个断点,看看它是否会发生
该页面将从缓存中显示。