ASP.NET浏览器显示“网页已过期”的后退按钮(回发后)

时间:2012-03-19 17:38:26

标签: asp.net back-button cache-control

我在使用简单的ASP.NET应用程序和回发后的后退按钮时遇到了问题。

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

“正常”流程是用户填写表单并可能更改下拉列表。根据下拉值,页面内容可能会发生变化。

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

我设置了以下内容:

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

但这似乎没有解决问题。

实际的Cache-Control响应头读取为:private,no-cache:“Set-Cookie”

在一个经典的ASP应用程序中,只有“私有”的Cache-Control响应头,后退按钮在“回发”后表现如预期。

是否有强制ASP.NET将缓存控制明确设置为“私有”?或者任何其他导致后退按钮和回发一起工作的解决方案?

谢谢!

2 个答案:

答案 0 :(得分: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();

        }

    }

答案 1 :(得分:1)

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

这就是这行代码:

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

这是一个问题,特别是对于WebForms ASP.NET,因为与其他框架相比,回发的工作原理。

为了全面解释所涉及的所有问题,我强烈建议您阅读下面链接的文章。它没有直接回答你的问题,但我认为你会得到更多的信息,而不是一个简单的答案,它将帮助你思考你的选择,更好地理解手头的问题。请务必阅读第1部分和第2部分。

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

我确实知道如何让“后退”按钮再次像“后退”按钮,因此回发不会被视为页面导航:

就个人而言,当我不希望postbacl / back按钮发生冲突时,我采用了一种(可以说是hackish / sloppy)方法将事物放在UpdatePanel中,因为我在大多数应用程序中都使用Ajax。这会强制“后退”按钮实际返回上一页,而不是停留在同一页面上,而是恢复到回发之前的控制值。