5

これはよくある質問のようですが、検索で何も返されません。

ページがアンロードされる前に実行される次のコードがあります。問題は、アンロードがポストバックである場合、ユーザーに警告を発したくないのですが、ポストバックとユーザーがナビゲートするのを区別する方法がわかりませんたとえば、別のページ。

// This is executed before the page actually unloads
        $(window).bind("beforeunload", function () {

            if (prompt) {

                //prompt
                return true;
            }
            else {

                //reset our prompt variable
                prompt = true;
            }
        })

コード ビハインドでスクリプトを実行します。つまり、Page.IsPostBack の場合、プロンプトを設定するオプションはありません。

何か案は?

編集:

これが私が最終的に得た解決策です:

 function DoNotPrompt() {
              prompt = false;
        }

次に、これをすべてのコントロールに追加し、ユーザーが何かを実行してポストバックを発生させることができるようにしました。

OnClientClick="DoNotPrompt()

次に、このフラグをチェックし、ユーザーが実際にページから離れていた場合、つまりポストバックではない場合にのみ、「beforeunload」に文字列を返しました。

このコードも使用する必要がありました: var magicInput = document.getElementById('__EVENTTARGET');

    if (magicInput && magicInput.value) {
        // the page is being posted back by an ASP control 
        prompt = false;
    }

その理由は、リスト ボックスであるカスタム ユーザー コントロールがあり、上記のメソッドを追加できなかったからです。そのため、これを使用してそのイベントをキャッチし、フラグを false に設定しました。

最もエレガントなソリューションではありません。

ありがとう、マイケル

4

3 に答える 3

2

次のように、送信をキャプチャして onbeforeunload をリセットできます。

jQuery(function($) {
    var form = $('form'), oldSubmit = form[0].onsubmit;
    form[0].onsubmit = null;

    $('form').submit(function() {       
        // reset the onbeforeunload
        window.onbeforeunload = null;

        // run what actually was on
        if(oldSubmit)           
            oldSubmit.call(this);           
    });
});

これは私のページからのテスト済みのコードです:)

于 2012-05-02T13:25:29.290 に答える
1

JavaScript はクライアントで実行されます。クライアントに関する限り、ページはビュー間で状態を維持しません。ポストバックは完全に ASP.NET の概念です。

Page.IsPostBackが trueかどうかに基づいて JavaScript 変数を定義するコードをサーバー側で実行することで、これを回避できます。

例:

<%@ Page Language="C#" AutoEventWireup="true"  %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Page.IsPostBack -> client</title>

    <script type="text/javascript">
        var isPostback = <%= Page.IsPostBack %>;
        console.log("IsPostBack: " + isPostback);
    </script>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Button runat="server" ID="btnTest" Text="Click me..." />
    </div>
    </form>
</body>
</html>
于 2012-05-02T13:23:04.247 に答える
1

__EVENTTARGETこれですべてのポストバック状況がカバーされるわけではありませんが、非表示の入力を調査することで、ページが ASP コントロールによってポストバックされたかどうかを判断できます。

この入力は、ページが ASP コントロールによってポストバックされたときに ASP によって設定されます。

var magicInput = document.getElementById('__EVENTTARGET');

if (magicInput && magicInput.value) {
   // the page is being posted back by an ASP control
}
于 2012-05-02T13:25:15.483 に答える