2012-05-02 3 views
4

これはよくある質問のようですが、検索で何も返されません。ASPでページをアンロードするのがポストバックであるかどうかを確認する方法

ページをアンロードする前に実行する次のコードがあります。アンロードがポストバックの場合、私はユーザーに私の警告を発したくありませんが、ポストバックと例えば、別のページにナビゲートするユーザ。

// 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がプロンプトを設定している場合、プロンプトはオプションではありません。

アイデア?

EDIT:

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に設定します。

最も優秀な解決策ではありません。

おかげで、 マイケル

答えて

1

これは、ポストバックの状況のすべてをカバーしないかもしれませんが、ページが__EVENTTARGET隠し入力を問い合わせることによって、ASP制御によりバック投稿された場​​合、あなたが言うことができます。

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

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

if (magicInput && magicInput.value) { 
    // the page is being posted back by an ASP control 
} 
+0

@Aristos magicInputは、DOMに見つからなかった場合は 'null'(偽)になり、見つかった場合は空の文字列(偽)になりますが、設定されていません。ステートメントは、隠れた入力が存在し、値を持っているかどうかをチェックします。 – jbabey

+0

私はそのアイディアを考えています。私はそれをテストしていないと思いますが、すべてのケースで__EVENTTARGETがポストバックの前に変更されていることを確認する必要があります。ここでは、__doPostBackが呼び出されたときに変更されたことがわかります。 – Aristos

+0

私はこれを試しましたが、何らかの理由ですべてのポストバックをキャプチャしていないと言っています。ユーザーがグリッド内の行を編集する場合など。 –

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> 
+0

ある

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); }); }); 

をポストバックが起こる前の最初の時間です。これは、2番目のポストバックの後で動作します。@Aristos。 – Aristos

+0

はい、正確に。ポストバックが実際に起こる前に知りたいので、beforeunload関数のコードがすでに実行されているので、実行中のサーバーサイドコードが遅すぎます。 –

+0

私の悪いです。その場合、Aristosの答えはマークに近いように見えます。 –

2

あなたはとonbeforeunloadを提出し、リセットキャプチャすることができます:私が、彼はそれがポストバックで知っておく必要があると考える。これは私のページからテストコード:)

+0

ページがリダイレクトされているか、ポストバックされているかを確認しますか? –

+0

@RoyiNamirこれは、フォームの送信を取得します。彼がリンクをクリックした場合、影響を受けていない、ポストバックをしていない。ここでアーカイブしようとしているのは、ポストバックにメッセージを表示しないことです。残りはすべてカウントされます。私は私のページに同じコードとトリックを使用します。 – Aristos

+0

私は今これを試してみます。 –

関連する問題