2009-09-03 14 views
1

ブラウザの更新ボタンを検出して使用を禁止するWebページがあります。 (さて、私はResponse.Redirectを提案しないでください、私はこのシナリオでそれを使用することはできません)。イベントの発射を停止する方法+ ASP.NET

このページを見てhttp://aspalliance.com/687_Preventing_Duplicate_Record_Insertion_on_Page_Refresh.4私は方法を見つけました。私はこのアイデアをコントロールに入れ、すべてのページにコントロールを配置する予定です。

私のページには非常に多くのボタンと他のコントロールが含まれています。私の心配は、それがリフレッシュポストの場合...私はどんな出来事も解雇されたくない...

私はすべてのイベントの冒頭にリフレッシュポストかどうかチェックするのは面倒ですアプリケーション全体がほぼ構築されています。

私に役立つアイデア。

  • ラジャ

より明瞭にするために、以下のテキストを含む:

こんにちはすべて、私は更新ボタンを押して、ユーザを停止したくない...少し誤解を願っています。..しかし、私が望むのは、それに応じてアプリケーションの応答を調整することです...シナリオを考えてみましょう。ユーザーがBUTTON-Aをクリックすると、別のページでポップアップウィンドウが開きます。ユーザーが戻ってメインウィンドウの更新ボタンをクリックすると、BUTTON-Aのクリックイベントが再び発生し、ポップアップウィンドウが再び開きます。このようなシナリオでは、ポップアップウィンドウ。だから、ASP.NETがBUTTON-A(または他の同様のボタン)のクリックイベントを発生させないようにする必要があります。

答えて

3

これは少なくともあなたがそれを行う方法の出発点です。私はすべてのロジックが100%であるわからないんだけど、

protected void Page_Load(object sender, EventArgs e) 
{ 
    foreach (Control control in Controls) 
    { 
     DisableEvent(control); 
    } 
} 
protected void Page_PreRender(object sender, EventArgs e) 
{ 
    foreach (Control control in Controls) 
    { 
     UpdateViewstate(control); 
    } 
} 
private void DisableEvent(Control current) 
{ 
    foreach (Control control in current.Controls) 
    { 
     if (control.GetType() == typeof(Button)) 
     { 
      if (IsPostBack) 
      { 
       if (Session["update" + control.ID].ToString() != ViewState["update" + control.ID].ToString()) 
       { 
        RemoveClickEvent((Button)control); 
       } 
       else 
       { 
        ((Button)control).Click += new EventHandler(Button_Disable); 
       } 
      } 
      else 
      { 
       Session["update" + control.ID] = Server.UrlEncode(System.DateTime.Now.ToString()); 
      } 
     } 
     DisableEvent(control); 
    } 
} 
private void UpdateViewstate(Control current) 
{ 
    foreach (Control control in current.Controls) 
    { 
     if (control.GetType() == typeof(Button)) 
     { 
      ViewState["update" + control.ID] = Session["update" + control.ID]; 
     } 
     UpdateViewstate(control); 
    } 
} 

void RemoveClickEvent(Button b) { 
    System.Reflection.FieldInfo f1 = typeof(Button).GetField("EventClick", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic); 
    object obj = f1.GetValue(b); 
    System.Reflection.PropertyInfo pi = typeof(Button).GetProperty("Events", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); 
    System.ComponentModel.EventHandlerList list = (System.ComponentModel.EventHandlerList)pi.GetValue(b, null); 
    list.RemoveHandler(obj, list[obj]); 
} 

protected void Button_Disable(object sender, EventArgs e) 
{ 
    Button b = (Button)sender; 
    Session["update" + b.ID] = Server.UrlEncode(System.DateTime.Now.ToString()); 
} 
4

私はあなたがこれを聞きたくないと思っていますが、ユーザーはリフレッシュボタン。彼らが好きなものを壊すと、彼らは不幸になるでしょう。彼らはあなたを責め、あなたの名前は泥になるでしょう。

[戻る]ボタンをブロックしようとするサイトについて考えてみましょう。あなたは好きですか?

+0

...そもそも何かである私は理解し...しかし、このページでは、私自身は、ユーザーが使用することができます更新ボタンを、提供していますコンテンツをリフレッシュするには...ボタンのクリックや他のイベントが再開されないようにしたい。 –

+1

@ King - 自分のリフレッシュボタンとブラウザに組み込まれているものとの違いは何ですか? – RichardOD

+1

私自身のリフレッシュボタンはページをリロードするだけで、最後のコントロールイベントを再開しません。 –

1

ユーザーが[更新]ボタンを押せないようにすることはできません。これは、前のリクエストを返送するブラウザの機能をビルドして、取得またはポストします。それだけである。

これは、通常、get(ユーザーがuser/1/editに投稿し、応答がuser/1/viewにリダイレクトする)の後にリダイレクトを行うため、リフレッシュによってダブル役職。

これはあなたが聞きたいことではありませんが、Webアプリケーションを作成する際には、Web標準に準拠して、ユーザーが期待するブラウザ機能を使用できるようにする必要があります。 、転送、リフレッシュを行います。そして、私はあなたのアプリケーションがほぼ終了したことを知っています。

しかし、リフレッシュを防止するためのハックの作成や、技術に慣れていなくてもストリームに対して上がっているようなものを作成し始めると、アプリケーションは悪いパッケージを持ち運び始めます。拡張されているので、この悪いパッケージは、さらなる開発の負担になるでしょう。

+1

こんにちはピート、私はちょっと誤解を望む...私は、リフレッシュボタンを押してユーザーを停止したくない...しかし、私が欲しいのは、私のアプリケーションの応答を応じて調整することです...シナリオを想像して、ポップアップウィンドウが開き、別のページが表示されます。ユーザーが戻ってメインウィンドウの更新ボタンをクリックすると、BUTTON-Aのクリックイベントが再び発生し、ポップアップウィンドウが再び開きます。このようなシナリオでは、ポップアップウィンドウ。だから、ASP.NETがボタンA(または他の同様のボタン)のクリックイベントを発生させないようにする必要がある –

+2

その特定のケースでは、ボタンにイベントハンドラとして直接新しいウィンドウを開くようにjavascriptを配置し、つまり、サーバーコントロールにしないでください。再ロード時に新しいページを開くためのJavaScriptを注入するイベントハンドラを持つサーバーコントロールを配置していると聞こえますか?その特定のケースは、ポストバックではありません – Pete

+0

"私はボタンにイベントハンドラとして直接新しいウィンドウを開くためにjavascriptを配置する"と私はクライアントサイドのJavaScriptイベントハンドラ – Pete

関連する問題