2

シナリオ

カスタム認証/認証方法を使用する ASP.NET プロジェクトがあります (フォーム/ウィンドウ認証などを使用するのではなく)。安全なページが読み込まれるたびに、次のコードが実行されます。

protected void Page_Load(Object sender, EventArgs e)
{
    if (!IsLoggedIn)
    {
        HttpContext.Current.Response.Redirect("~/Login/", true);
    }
}

このコードは基本的に、ユーザーがまだログインしているかどうか (ASP.NET セッションの有効期限が切れていないか、ログアウトしていないかなど) をチェックします。ユーザーがログインしていない場合はResponse.Redirect()、ログイン ページに送られます。

このシナリオは、ユーザーが (リンクまたは直接 URL を介して) 完全なページを要求する場合に完全に機能します。非同期ポストバックを使用すると問題が発生します。

の中にボタンがネストされているため、<asp:UpdatePanel>クリックすると非同期ポストバックが発生します。このボタンは、<asp:Label />. 例えば:

<!-- the button -->
<asp:LinkButton ID="MyButton" CausesValidation="false" Text="My Button" OnClick="MyButton_Click" runat="server" />

<!-- the label -->
<asp:Label ID="MyLabel" runat="server" />
protected void MyButton_Click(Object sender, EventArgs e)
{
    MyLabel.Text = DateTime.Now.ToString();
}

問題

非同期ポストバックが実行中で、IsLoggedInfalse の場合、リクエストはログイン ページにリダイレクトされます。現在、ASP.NET Framework は (HTML ページではなく) 特定の応答を期待しています。したがって、次のエラーがスローされます。

ここに画像の説明を入力

質問

この問題を解決するにはどうすればよいですか? 非同期ポストバック中にページ全体をコード ビハインドから特定のアドレスに強制的にリダイレクトするにはどうすればよいですか?

4

3 に答える 3

4

ケネスの答えはリダイレクトの適切な方法ですが、もう少しカスタムが必要でした。

非同期ポストバック中に、シミュレートする必要がありましResponse.Redirect("path", true)た。trueパラメーター(現在のページの実行を終了する必要があるかどうかを示します)は、複製する必要がある重要なものです! ブラウザに応答が返されないため、単にResponse.End()afterを使用しても機能しません。ScriptManager.RegisterClientScriptBlock()

非同期ポストバックに対するサーバーの応答を分析することで、次のハックを使用することにしました (を使用して応答をシミュレートしますResponse.Write)。

String jsRedirect = String.Format("window.location.pathname = '{0}';", VirtualPathUtility.ToAbsolute(url));

Response.Write(
    // required parameters!
    "0|asyncPostBackControlIDs|||" +
    "0|postBackControlIDs|||" +
    "0|updatePanelIDs|||" +
    "0|childUpdatePanelIDs|||" +
    "0|panelsToRefreshIDs|||" +

    // your custom JavaScript
    String.Format("{0}|scriptBlock|ScriptContentNoTags|{1}|", jsRedirect.Length, jsRedirect)
);
Response.Flush();
Response.End();
于 2013-04-03T17:53:05.083 に答える
3

If you want to trigger from the code-behind you can do this:

if (ScriptManager.GetCurrent(Page).IsInAsyncPostBack) {
    ScriptManager.RegisterStartupScript(updatepanelid, typeof(string), "redirect", "window.location = 'http://www.google.com';", true);
} else {
    Response.Redirect("http://www.google.com");
}

Also note that if you use window.open(), a popup window will be opened (which may or may not be blocked). If you use window.location = "someurl"; it will just do a client-side redirect.

于 2013-04-02T22:25:30.550 に答える
0

ここにはいくつかの用語の誤解があります。「非同期ポストバック」は技術的にはポストバックではありません。それはxmlHttpRequestです。ここでリダイレクトを行いたい場合は、window.open().

asp.net AJAX を使用してこれを実装する方法がわかりません。サーバー上で xmlHttpRequest コードを実行している間、クライアントをリダイレクトすることはできません (明確化 - リダイレクトすることはできますが、応答する html は (あなたの場合のように) asp.NET の javascript ajax コードによって正しく解析されません。

jQuery を使用すると、これは疑似ソリューションになります。

$.ajax({
    success: function(data) {
        if (data == 'redirect') {
            window.open('yourRedirectUrl');
        }
    }
});
于 2013-04-02T20:28:09.190 に答える