当我按浏览器的“返回”按钮时会发生什么?

17
考虑以下情形:
  1. 我访问了一个使用ASP.NET构建的网站页面。该页面是一个包含ASP.NET服务器控件的简单aspx页面。

  2. 我单击链接,跳转到同一网站上的其他页面。

  3. 我单击浏览器的 返回 按钮。

问题:在页面生命周期方面会发生什么?所有事件是否都会发生,还是浏览器只显示缓存版本的页面而不进行任何请求?
回答:当用户单击浏览器的后退按钮时,如果浏览器具有缓存可用,则会从缓存中加载该页面,并且页面生命周期中的大多数事件都不会发生。但是,在某些情况下,例如在某些ASP.NET WebForm应用程序中,可能会发生部分页面生命周期事件,例如Page_Load事件。
4个回答

16

我认为最好的答案是:这取决于浏览器,尤其是在提交后(postback)。

旧版本的浏览器会弹出一个确认对话框,提示“该页面包含将被重新提交的POST数据”,您可以继续(重新提交)或取消。 由于ASP.NET WebForms中的所有内容都是FORM元素的一部分(ViewState,事件等),因此这将导致整个生命周期重复。

当然,这会导致重复提交问题不断出现,因此许多站点必须想出解决方案来解决重复问题,今天大多数浏览器只是从缓存中获取页面。

…除非您覆盖缓存控制标头并强制浏览器不要将页面存储在缓存中。 显然,在这种情况下,它无法从缓存中检索,因此通常会重新提交。 但是,再次强调,这取决于浏览器-例如,某些浏览器不允许通过SSL重新提交,因此如果使用该协议,则用户将只会看到一个消息,指示该页面已过期/无法显示。

现在想想,也许更好的答案是:作为网站设计师,您真的不能依赖于用户单击“返回”按钮时浏览器的任何特定行为。 如果重复提交可能会产生负面影响(例如两次刷信用卡),则需要采取足够的措施防止发生这种情况。 这也是好的实践,因为用户有可能仅仅是意外地双击了“提交”按钮。


我同意Aaronaught的答案。我不会尝试编写任何假定“后退”按钮在所有浏览器中都会以某种方式运行的代码。 - jessegavin
我认为你考虑了一个不同的场景,即使用控件后进行相同页面的后退操作,然后按下“返回”按钮... 我是对的吗? - Manish
@Manish:重要的不是用户当前页面是否有POST数据,而是上一个页面(后退按钮将带他们到达的页面)是否有POST数据。这包括两种情况-从postback返回和从具有postback(或仅为POST)的上一页返回新页面。 - Aaronaught

1

我们甚至尝试过

Response.ExpiresAbsolute = DateTime.Parse("1/1/1980");
Response.AddHeader("cache-control", "no-store, must-revalidate, private");
Response.AddHeader("Pragma", "no-cache");

解决这种问题


0
通常所有事件都应该发生,但如果您使用的是超级浏览器,它可能会显示缓存页面,您可以在“页面加载”中设置断点,看看是否会发生。

0

该页面将从缓存中显示。


那么如果我设置了Response.Cache.SetCacheability(HttpCacheability.NoCache),那么点击返回按钮会导致浏览器为先前的页面发出Get请求,甚至可能会进行回传操作,如果这是用户的最后一个操作的话? - AaronLS
如果您设置了Response.Cache.SetCacheability(NoCache),则是的,它会回传,但对于某些页面,您将看到相同的内容。尝试使用以下代码: Response.Cache.SetCacheability(HttpCacheability.NoCache); Response.Cache.SetExpires(DateTime.Now-new TimeSpan(1,0,0)); Response.Cache.SetLastModified(DateTime.Now); Response.Cache.SetAllowResponseInBrowserHistory(false); - Ravi Vanapalli
我认为你会收到一个“页面已过期”的通知,而不是页面本身,但我认为这仍取决于浏览器。 - Codesleuth

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