4

我希望有人可以帮助描述我在 IE 上的 ASP.NET 网站上遇到的以下问题的解决方法。在下文中,我将描述错误并阐明所需解决方案的要求。

复制步骤:

  1. 用户访问A.aspx
  2. A.aspx 使用 Response.Redirect 将用户带到 B.aspx#house
  3. 在 B.aspx#house 上,用户单击设置 window.location.hash='test' 的按钮

实际结果:

B.aspx 再次加载。URL 现在显示 B.aspx#test

预期成绩:

没有重装。URL 将更改为 B.aspx#test

要求:

  1. 页面 A 必须在 url 中使用片段标识符重定向到页面 B
  2. 页面 B 上的任何用户操作都会设置 location.hash
  3. 设置location.hash不能让页面B刷新
  4. 这必须在 IE 上工作

笔记:

  1. 仅在 IE 上复制错误(在 ie6|7|8 上测试)。Opera、FF、Chrome、Safari 都有不重载的预期结果。
  2. 这个错误可能与ASP.NET无关,与IE有关
  3. 对于任何愿意查看此内容的好心人,我创建了一个最小的 ASP.NET Web 项目,以便在此处轻松复制
4

2 回答 2

2

如果在重定向后页面上有禁止缓存的指令,则在 IE 中会发生这种情况。如果您删除 No-Cache 标头,您会发现问题不再重现。

这是一个演示该行为的Meddler 脚本

import Meddler;
import System;
import System.Net.Sockets;
import System.Windows.Forms;

class Handlers
{
    static function OnConnection(oSession: Session)
    {
        if (oSession.ReadRequest())
        {       
            var oHeaders: ResponseHeaders = new ResponseHeaders();
            oHeaders["Connection"] = "close";

            if (oSession.urlContains("postRedir.asp"))
            {
                oHeaders.Status = "200 OK";
                oHeaders["Content-Type"] = "text/html"; 
                oHeaders["Cache-Control"] = "no-cache";
                oSession.WriteString(oHeaders);
                oSession.WriteString("");
                oSession.WriteString("Top of page<br /><br /><br /><br /><br /><br />");
                oSession.WriteString("<br /><br /><br /><br /><div id='firstAnchor'>Div with ID firstAnchor</div>Click this link: <A href='#secondAnchor'>#secondAnchor</A>");
                oSession.WriteString("<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />");
                oSession.WriteString("<br /><br /><br /><br /><br /><br /><br /><br /><br /><div id='secondAnchor'>Div with ID secondAnchor</a>");

            }
            else
                if (oSession.urlContains("doRedir.asp"))
                {
                    oHeaders.Status = "301 Redir";
                    oHeaders["Location"] = "/postRedir.asp#firstAnchor";                        
                    oSession.WriteString(oHeaders.ToString());          
                }
            else
            {
                oHeaders.Status = "200 OK";
                oHeaders["Content-Type"] = "text/html"; 
                oSession.WriteString(oHeaders);
                oSession.WriteString("This is a test case for http://stackoverflow.com/questions/1985056/response-redirect-with-a-fragment-identifier-causes-unexpected-refresh-when-later<BR/>");
                oSession.WriteString("Click this link: <A href='doRedir.asp'>Do Redirect</A>");
                oSession.WriteString("<form action='doRedir.asp' method='post'><input type=submit value='Submit as form' /></form>");
            }
        }

        oSession.CloseSocket();
    }
}
于 2010-03-11T05:01:25.240 回答
1

我也有同样的问题。我已经尝试了上面 Eric 的建议(没有 Cache-Control 标头),但它仍然不起作用。这似乎是 IE 中的一个错误。

这个问题提到了一个带有这些词的错误:“所以这个错误可能是ie错误。当web应用程序通过重定向时,浏览器可能只能看到prev url,所以当你修改location.hash时,浏览器会执行url改变,所以刷新页面。”

我也尝试过使用不同类型的字符集建议的解决方案,但没有成功。

于 2010-08-09T14:19:31.843 回答