2

window.onunloadイベントがpag​​e_loadイベントの後に発生することに気づきましたが、これは意味がありません。

この動作は私にとって問題を引き起こしています-私のアンロードでセッションをクリアするので、アンロードの前に最初にPage_Loadを実行すると、表示されるページにエラーが発生します。

Page_Loadの前にjavascriptonunloadが起動することを期待します....それは正しい仮定ですか?

明確にするために:私がページtest.aspxにいると仮定して、同じページに移動するリンクをクリックします(たとえば、メニューをクリックします)。私が観察するのは、Page_Loadが最初に起動し、次にonunloadが起動することです。まったく意味がありません。

4

6 に答える 6

2

これはブラウザ固有の動作です。ChromeとFFは、onunloadが起動される前にGETリクエストを送信し、IE8は最初にonunloadを実行します。わからない、他のブラウザがそれをどのように処理するか。この機能に依存しない方がよいでしょう。

于 2010-12-16T12:22:30.240 に答える
1

ページに共通の基本クラスを使用し、リクエストがポストバックでない場合はそこでセッションをクリアすることを検討しましたか(ポストバックにセッションを使用していると思います)?

public class BasePage : System.Web.UI.WebControls.Page {
  protected override OnPreInit (EventArgs e) {
    // Get in nice and early, however you could use OnInit if you prefer
    if (!Page.IsPostBack) {
      Session.Clear();
    }          
}

次に、セッションをクリアする必要があるページを次のように宣言できます。

public class SpecialPage : BasePage {
  // Your page logic goes here.
  // Note that if you need to do work in OnPreInit here you should call
  // base.OnPreInit(e) first.
}
于 2010-03-02T11:32:54.990 に答える
0

セッション変数の削除を処理するユーティリティ関数を記述し、それぞれのメニュークリックイベントでその関数を呼び出すことができます。ウィンドウのアンロードはページのロード後にのみ発生するため、これを使用する方が簡単です。

于 2010-03-02T10:03:15.870 に答える
0

window.unloadが実際に起動するのは、移動先の新しいページをレンダリングする必要がある場合のみだと思います(つまり、新しいHTMLの代わりに古いDOMが破棄されます)ブラウザは、表示するHTMLを使用してサーバーから応答が返されるまで、何をレンダリングするかを認識しません。そのHTMLは、Page_Loadを含むページライフサイクルが完了するまで生成されません。したがって、window.unloadの前のpage_load?

いずれにせよ、window.unload中にセッションをクリアできる場合は、ユーザーの操作に応じてセッションをクリアして、もう少し明確にしてみませんか?

編集:window.onbeforeunloadも試してみませんか?

于 2010-03-02T00:17:07.810 に答える
0

イベントは、新しいページのonunloadリクエストがサーバーに送信される前に発生するため、Page_Loadメソッドがサーバーで実行される前に確実に発生します。

onunload問題は、イベントからサーバーに別のリクエストを送信している可能性があります。IISは各ユーザーから一度に1つの要求のみを処理するため、この要求はキューに入れられ、新しいページの要求の後に実行されます。

于 2010-03-02T00:45:07.047 に答える
0

セッションを使用して、ページごとに変化する一時変数を保存しているようです。セッションはこの種のシナリオにはあまり適していないと思います。より良い解決策は、リクエストごとにのみスコープされるHttpcontextのItemコレクションを使用することです。データを保存するときのセッションとまったく同じように機能します。

Context.Items["myvariable"] = "some data";

スコープはリクエストごとにのみ適用されるため、各ページリクエストに保存したアイテムをクリアするためにJavaScriptを使用する必要はありません。

于 2010-03-15T18:15:41.260 に答える