4

IE の ASP.NET Web サイトで発生している次の問題に対する回避策の説明を誰かが手伝ってくれることを期待していました。以下では、バグについて説明し、必要なソリューションの要件を明確にします。

再現手順:

  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 アプリの場合、ブラウザーは前の URL しか表示しない可能性があるため、location.hash を変更すると、ブラウザーは URL を実行します。変更しますので、ページを更新してください。」

また、さまざまな種類の文字セットで提案された解決策を試しましたが、成功しませんでした。

于 2010-08-09T14:19:31.843 に答える