我在使用简单的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将缓存控制明确设置为“私有”?或者任何其他导致后退按钮和回发一起工作的解决方案?
谢谢!
答案 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。这会强制“后退”按钮实际返回上一页,而不是停留在同一页面上,而是恢复到回发之前的控制值。