2014-01-07 9 views
8

下のリンクによると、更新パネル内の投稿の中で「Response.Redirect」を実行すると、HTTPResponseCodeが200になり、Ajax javascriptyライブラリがそれを引き継ぎ、ユーザーをページ。UpdatePanel投稿からの代行受信のリダイレクト

https://connect.microsoft.com/VisualStudio/feedback/details/542238/redirecting-during-ajax-request-returns-wrong-status-code

しかし、私はすべてのリダイレクトをインターセプトし、値を格納するためのURLを変更していたモジュールを書いています。 PreSendRequestContentイベント中にこれをやっています。以下は私のコードです

HttpApplication app = (HttpApplication)sender; 

if (app.Response.StatusCode == 302 && !app.Response.RedirectLocation.Contains("MyValue")) 
{ 
    // Add MyValue to URL 
} 

上記のリダイレクト中に同じことをする方法はありますか?私はこれをonEndRequestまたは類似のイベントとサーバー側の他のモジュールイベントを使用してクライアント側で行うことは大丈夫です

答えて

0

ここで私が見つけた汚い解決策です。私はクライアント側で以下のコードを追加しました。

Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(beginRequest); 
    function beginRequest(sender, args) { 
     args._request._events.addHandler('completed', changeURL); 
    } 
    function changeURL(sender, args) { 
     var s = new String(sender._xmlHttpRequest.responseText); 
     if (s.indexOf('pageRedirect') > -1) 
     { 
      var pattern = 'pageRedirect||'; 
      var s1 = s.substring(s.indexOf(pattern) + pattern.length, s.length); 
      var nextPipe = s1.indexOf('|'); 
      var encodedURL = s1.substring(0, nextPipe); 
      encodedURL = decodeURIComponent(encodedURL); 
      window.location.href = DoCustomizationsOntheURL(encodedURL); 
      args.stopPropagation(); 
     } 
    } 

しかし、私はこのソリューションに満足していないんだと、より良い方法を探して、他の方法を提案してください。

2

私はupdatepanelを使って少しテストを行いましたが、私が知る限り、Response.IsRequestBeingRedirectedというプロパティを見て、応答が更新パネルによってリダイレクトされているかどうかを判断できます。このプロパティは、updatepanels内部からのリダイレクトを見ているときと、通常のリダイレクトを行っているときの両方で正しく答えているようです。問題は、レスポンスが更新パネルによってリダイレクトされるとき、Response.RedirectLocationがnullであることです。つまり、URLを変更するためにレスポンスの実際の内容を変更する必要があります。

レスポンス出力ストリームが書き込み専用であるため、内容を変更して応答を上書きすることもできないため、レスポンスの内容を変更するのは非常に難解です。私が見つけた唯一の方法は、Hereと記載されているように、応答にフィルターを接続する必要があります。しかしこれは多少複雑で、かなりのコードを必要とし、PreSendRequestContentの前にフィルターを接続する必要があります(私は正確なタイミングはわかりませんが...)。これはフィルターを作成する必要があることを意味しますコンテンツを変換するかどうかを決定するためにレスポンスへの参照を取る。

上記フィルタはやり過ぎのように思えるので、多分あなただけの正規表現を使用することによって、あなたのjavascriptのビットをクリーンアップすることができます:

var redirectRegex = /pageRedirect\|{2,}(\S+)\|/; 

function changeURL(sender, args) { 
    var s = new String(sender._xmlHttpRequest.responseText); 

    var match = redirectRegex.exec(s); 
    if (match) 
    {    
     encodedURL = decodeURIComponent(match[1]); 
     window.location.href = DoCustomizationsOntheURL(encodedURL); 
     args.stopPropagation(); 
    } 
} 

しかし、上記の正規表現は、私のテストのURLに取り組んでいますが、私はできませんそれがすべてのために働くことを保証する。

URLを変換してリダイレクトポイントで呼び出す静的/拡張メソッドを考えましたか?

+0

この機能を追加しようとしている従来のアプリに触れていない場合は、私は拡張ルートに行っても構いません。 Response.Redirectから新しい内線番号に呼び出しを変更する必要がある場所がかなりあります。私は正規表現の考え方が好きで、それを私のソリューションに統合します。 –

+0

レガシーアプリケーションを更新していて、アプリケーション全体で機能するソリューションが必要な場合は、おそらく前述のレスポンスフィルタを検討する価値があります。それはかなりの定型文を必要としますが、かなり堅牢で、あなたはjavascript実装の気まぐれに依存しないでしょう。 – rusmus

+0

このフィルタの唯一の問題は、私がしたくないレスポンスバッファの内容を変更する必要があることです。Javascriptは、マスターページレベルで追加するとうまく機能します。 –