2010-02-01 198 views
16

考虑场景:当我按浏览器BACK按钮时会发生什么?

  1. 我参观了使用ASP.NET建立了一个网站的页面。该页面是一个简单的包含ASP.NET服务器控件的aspx页面。

  2. 我点击了一个链接,该链接将我带到同一网站上的其他页面。我点击浏览器的按钮返回按钮。

问题:在页面生命周期而言,会发生什么?是否发生所有事件或者浏览器仅显示页面的缓存版本而不提出任何请求?

回答

15

我认为最好的答案是:它取决于浏览器,特别是在发布/发布后。

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

当然,这不会导致重复提交问题,所以很多网站都必须为重复问题提出解决方法,而今天大多数浏览器都只是从缓存中取出页面。

...这就是除非你重写缓存控制标题并强制浏览器不要将页面存储在缓存中。显然,在这种情况下,它不能从缓存中检索,所以通常会被重新提交。但是,这又取决于浏览器 - 例如,某些浏览器不允许通过SSL重新提交,所以如果这是正在使用的协议,则用户将看到一条消息,指出该页面已过期/不能所示。

回想一下,可能更好的答案是:作为网站设计者,当单击“后退”按钮时,您确实无法依赖用户浏览器中的任何特定行为。如果重复提交可能产生负面影响(例如对信用卡收取两次),那么您需要采取适当的措施来防止发生这种情况。无论如何,这是一个很好的做法,因为用户完全可以简单地双击“提交”按钮。

+0

我同意Aaronaught的回答。我不会试图编写任何假设“后退”按钮在所有浏览器中都会以某种方式行事的代码。 – jessegavin 2010-02-01 08:04:58

+0

我认为你考虑过使用控件后备相同页面然后按下BACK按钮的不同场景...... 对吗? – Manish 2010-02-01 09:35:46

+0

@Manish:重要的不一定是用户的* present *页面是否有'POST'数据,但是* previous *页面(后退按钮会带给他们的那个页面)是否有'POST'数据。这包括两种情况 - 从回发返回,并在上一页有回发(或“POST”)时从新页返回。 – Aaronaught 2010-02-01 12:49:32

0

通常所有的事件应该发生,但如果你有一位超级浏览器比它可能发生在显示缓存页面 你可以将断点在你的页面加载,看看它是否会发生

0

该页面将从缓存中显示。

+0

所以,如果我有Response.Cache.SetCacheability(HttpCacheability.NoCache)设置,将打回导致浏览器发出GET如果这是用户的最后一个操作,那么请求这个挑衅性的页面,或者甚至可以回传一个回复? – AaronLS 2010-02-01 07:58:55

+0

是的,它会回发,如果你有Response.Cache。SetCacheability(NoCache)设置,但对于某些页面,您将看到相同的内容。使用 尝试使用Response.Cache.SetCacheability Response.Cache.SetExpires(DateTime.Now-new TimeSpan(1,0,0)); Response.Cache.SetLastModified(DateTime.Now); Response.Cache.SetAllowResponseInBrowserHistory(false); – Ravia 2010-02-01 08:21:34

+0

我想你会得到一个“页面过期”的通知,而不是页面,但我认为它依赖于浏览器。 – Codesleuth 2010-02-01 08:22:24

1

我们甚至试图

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

解决这类问题

相关问题