2012-03-19 37 views
6

我在回发后遇到简单的ASP.NET应用程序和后退按钮时遇到问题。ASP.NET浏览器显示“网页已过期”作为后退按钮(回传后)

有问题的页面上有一个简单的表单,一些文本字段等,以及一个回发(autopostback)的下拉菜单。

“正常”流程是用户填写表单并可能更改下拉菜单。基于下拉值,页面内容可能会改变。

我遇到的问题是,用户更改下拉并回发完成后,用户单击后退按钮。他们看到来自IE的“网页已过期”消息。

我设置如下:

Response.Cache.SetExpires(DateTime.Now.AddMinutes(-1)); 
Response.Cache.SetCacheability(HttpCacheability.Private); 

但是,这似乎并没有钉上了这一问题。

实际的Cache-Control响应头读作:私营,无缓存:“设置Cookie”

在只有“私人”返回按钮的的Cache-Control响应头一个传统的ASP应用程序在“回发”后表现如预期。

有没有办法强制ASP.NET将cache-control明确地设置为“private”?或者任何其他解决方案导致后退按钮和回发协同工作?

谢谢!

回答

1

你正在处理的是一个老问题。实质上,您看到“网页已过期”消息的原因是禁用“后退”按钮的技术之一已被采用。该技术将缓存设置为过去的日期,因此如果用户单击“后退”按钮,则会导致浏览器显示此错误。

这将是这行代码:

Response.Cache.SetExpires(DateTime.Now.AddMinutes(-1)); 

这一直是一个问题,尤其是与ASP.NET的WebForms因为回传是如何工作的,相对于其他框架。

有关所有问题的详细解释,我强烈建议阅读下面链接的文章。它没有直接回答你的问题,但我认为你会从中得到更多的信息,而不是一个简单的答案,并且会帮助你通过你的选择来思考,并且更好地理解手头的问题。请务必阅读部分1和2

http://www.4guysfromrolla.com/webtech/111500-1.shtml

我有关于如何使“返回”按钮,像一个“后退”按钮,再一个想法,让回发不作为治疗页面导航:

就个人而言,我已经通过了(可以说的hackish /马虎)的只是把东西在一个UpdatePanel时,我不希望postbacl /后退按钮冲突做,因为我在我的大多数应用程序使用Ajax方法无论如何。这迫使“返回”按钮实际返回到上一页,而不是站在同一页面上,而是恢复到回发之前的控制值。

+0

这没有什么意义,我认为是到期设置为-1分钟的经典ASP应用程序,缓存控制私人让回按钮工作“按预期方式”,但一个过期设置为-1分钟并且缓存控制设置为“private,no-cache:set cookie”的ASP.NET应用程序不会。这对我来说似乎指向了“no-cache:set cookie”作为问题。 – user505765 2012-03-19 17:57:23

+0

我明白了。不同之处在于,经典ASP没有后援可以与之抗衡。点击一个按钮会触发表单的“动作”,并且每次都会载入一个全新的页面。在ASP.NET中,如果更改下拉列表,并且该下拉列表中的“autopostback”设置为true,则浏览器实际将此视为导航到新页面。这就是回传如何实施的原因,在这种情况下,这是一个恒定的批评来源。从技术上来说,更改autopostback的下拉列表确实会触发表单上的“发布”选项,但WebForms范例会模糊它... – David 2012-03-19 18:00:10

+0

也许这是一个更好的解释 - 对浏览器来说,每次回发实际上是一次新的页面访问,它存储在历史记录中,即使WebForms范例试图使它看起来不像开发人员那样。 – David 2012-03-19 18:03:33

2

根据情况你可以摆脱这个技巧/解决方法:

private void Page_PreRender(object sender, System.EventArgs e) 
    { 
     if (IsPostBack && !IsCallback) 
     { 

      Response.Write("<html><head><script>location.replace('" + Request.Path + "');\n" + "</script></head><body></body></html>\n"); 

      Response.End(); 

     } 

    }