Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 当我按下浏览器后退按钮时会发生什么?_Asp.net_Page Lifecycle - Fatal编程技术网

Asp.net 当我按下浏览器后退按钮时会发生什么?

Asp.net 当我按下浏览器后退按钮时会发生什么?,asp.net,page-lifecycle,Asp.net,Page Lifecycle,考虑以下场景: 我访问了一个使用ASP.NET构建的网站的页面。该页面是一个简单的aspx页面,包含ASP.NET服务器控件 我点击了一个链接,它把我带到同一网站上的其他页面 我点击了浏览器的后退按钮 问题:页面生命周期会发生什么变化?是所有事件都发生了,还是浏览器只显示页面的缓存版本而不发出任何请求?通常所有事件都应该发生,但如果您使用uber浏览器,则可能会显示缓存页面 你可以在页面加载中设置一个断点,看看它是否会发生。页面将从缓存中显示。我认为最好的答案是:这取决于浏览器,尤其是在发布/回

考虑以下场景:

  • 我访问了一个使用ASP.NET构建的网站的页面。该页面是一个简单的aspx页面,包含ASP.NET服务器控件

  • 我点击了一个链接,它把我带到同一网站上的其他页面

  • 我点击了浏览器的后退按钮


  • 问题:页面生命周期会发生什么变化?是所有事件都发生了,还是浏览器只显示页面的缓存版本而不发出任何请求?

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

    页面将从缓存中显示。

    我认为最好的答案是:这取决于浏览器,尤其是在发布/回发之后

    以前的浏览器通常会弹出一个确认对话框,大意是“页面包含将重新提交的帖子数据”,您可以继续(重新提交)或取消。由于ASP.NET WebForms中发生的一切都是
    表单
    元素(ViewState、events等)的一部分,这将导致整个生命周期重复

    当然,这给重复提交带来了无尽的麻烦,因此许多网站不得不为重复问题想出解决办法,而今天大多数浏览器只是从缓存中获取页面

    …即,除非覆盖缓存控件标题并强制浏览器不将页面存储在缓存中。显然,在这种情况下,它无法从缓存中检索,因此通常会被重新提交。但是,这又取决于浏览器-例如,某些浏览器不允许通过SSL重新提交,因此如果这是正在使用的协议,那么用户只会看到一条消息,说明页面已过期/无法显示

    仔细想想,也许更好的答案是:作为一名网站设计师,当点击后退按钮时,你真的不能依赖用户浏览器的任何特定行为。如果重复提交可能会产生负面影响(例如向信用卡收取两次费用),那么您需要采取足够的措施防止这种情况发生。不管怎样,这都是一个很好的实践,因为用户完全有可能只是偶然地双击“提交”按钮。

    我们甚至尝试过

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

    要解决此类问题

    因此,如果设置了Response.Cache.SetCacheability(HttpCacheability.NoCache),回击是否会导致浏览器对提供的页面发出Get请求,或者如果这是用户的最后一个操作,甚至可能是回发?是的,如果设置了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);我想你会收到“页面过期”通知而不是页面,但我认为这仍然取决于浏览器。我同意Aaronaught的回答。我不会尝试编写任何假定“后退”按钮在所有浏览器中都会以某种方式运行的代码。我认为您考虑了一种不同的场景,即使用控件对同一页面进行后置,然后按下后退按钮。。。我说得对吗?@Manish:重要的不一定是用户当前页面是否有
    POST
    数据,而是上一页(后退按钮将带他们去的页面)是否有
    POST
    数据。这包括两种情况-从回发返回,以及在上一页有回发时从新页返回(或仅
    POST
    )。