2017-02-01 15 views
0

JavaScriptボタンをクリックすると無効になり、ダブルクリックを防止するためにほとんどの場合動作しますが、場合によっては動作しないため、サーバーからのダブルクリックも防止します側。ダブルクリックのシナリオではサーバー側からボタンダブルクリックを防止する方法

protected void Page_Load(object sender, EventArgs e) 
{ 
    if(!IsPostBack) 
    { 
    hfid.value="0"; 
    } 
} 
protected void frmSubmit_Click(object sender, EventArgs e) 
{ 
    if(Convert.ToInt32(hfid.value) == 0) 
    { 
    // Code of insert 
    // then I set hfid.value with newly created id 
    } 
} 

<asp:Button ID="frmSubmitInsert" runat="server" OnClick="frmSubmit_Click" OnClientClick="GRVMasterAddButton_Click(this)" Text="Add" 
               Width="100px" Visible="false" ValidationGroup="masterGrp" /> 



function GRVMasterAddButton_Click(btn) 
     { 

      if (window.Page_ClientValidate('masterGrp')) 
      { 
      document.getElementById(btn.id).disabled = true; 
       __doPostBack(btn.id, ''); 
      } 

     } 

、2回のラウンドトリップは、それがokですgenerated.Inまず往復ですが、私は新しく挿入されたIDを持つhfid.value設定していても第二ラウンドトリップで、それが再び私に0を示し、重複レコードが生成されます。

+0

サーバー側ではないが、クリックした後でボタンを非表示にすることができます! –

+0

この前の質問を確認してください:https://stackoverflow.com/questions/106509/disable-button-on-form-submission回答は、サーバー側とクライアント側の両方のソリューションを提案します –

+0

ボタンを無効にするか非表示にすることができます – Hemal

答えて

0

ベストオプションは、最初のクリックでjavascriptを使用してクライアント側のボタンを無効にします。

+0

OPは、特にサーバー側のソリューションを求めています。 JavaScriptの無効化が既に行われているということが質問に記載されています。 – CoolBots

+0

@CoolBotsあなたは正しいです、私はそれをサーバー側から防止したい、私はすでにクライアント側から無効にします。 –

-2

ロックを使用できます。同時に複数の通話を防止する。 、イベントで

追加:

private object _lockObj = new object(); 
protected void frmSubmit_Click(object sender, EventArgs e) 
{ 
    // Here we lock code. When someone else will try to access to this code 
    // or in your case double clicked button it will wait until _lockObj 
    // is set to free. 
    Lock(_lockObj) 
    { 
     if(Convert.ToInt32(hfid.value) == 0) 
     { 
     // Code of insert 
     // then I set hfid.value with newly created id 
     } 
    } 
} 
+0

ロックオブジェクトはリクエストごとに破棄されるため、これは機能しません。 ASP.NETページを参照してくださいLifeCycle:https://msdn.microsoft.com/en-us/library/ms178472.aspx – CoolBots

+0

これは他のスレッドがロックされた領域に入るのを防ぎます。ウェブサイトの場合、これは確実に傷つける方法ですスケーラビリティ。また、使用前に '_lockObj'をインスタンス化していないので、コンパイルされません。 – sh1rts

+0

@CoolBotsそれは完全に動作します。 _lockObjはグローバルな@sh!rtsありがとうございます。そして、ちょっと、誰もこのコードの部分に同時に2回触れることを望んでいないのですか?彼の論理と構造の間違いは実際に彼が問題になっている。彼はダブルコール(CLICK)を回避する方法を尋ねるので、両方のdownvotesが公正でないと信じて... – Sergio

1

あなたが二回提出するコードを実行していないサーバー側を確実にするために、あなたのfrmSubmit_ClickイベントハンドラでSession変数を使用することができます

Session["isProcessingForm"] = false; 

protected void frmSubmit_Click(object sender, EventArgs e) 
{ 
    if(Session["isProcessingForm"]) 
    { 
     return; 
    } 

    Session["isProcessingForm"] = true; 

    if(Convert.ToInt32(hfid.value) == 0) 
    { 
     // Code of insert 
     // then I set hfid.value with newly created id 
    } 

    //Once form is processed 
    Session["isProcessingForm"] = false; 
} 
のように frmSubmit_Clickイベントハンドラを変更します。

このアプリケーションをWebファーム(複数のWebサーバー)で実行する場合は、セッション状態を維持する必要があります。 ASP.NET WebFormsにはいくつかの方法があります。詳細はこちら:https://msdn.microsoft.com/en-us/library/ms178581.aspxとここに:https://msdn.microsoft.com/en-us/library/ms178587.aspx

0

以下を試してください:それは間違いなく動作するはずです。

protected void Page_Load(object sender, EventArgs e) 
     { 
       if(!IsPostBack) 
       { 
        hfid.value="0"; 
       } 
      frmSubmit.Attributes.Add("onclick", "this.disabled = true; this.value = 'Loading ...'; " + ClientScript.GetPostBackEventReference(frmSubmit, null) + ";"); 
     } 

    protected void frmSubmit_Click(object sender, EventArgs e) 
     { 
      //Remove following line, this is added just to test. 
      System.Threading.Thread.Sleep(5000); 
      if (Convert.ToInt32(hfid.Value) == 0) 
      { 
       // Code of insert 
       // then I set hfid.value with newly created id 
      } 
     } 
+0

これは、送信する直前にボタンを無効にし、ポストバックが完了するまで無効にします。 –

+0

'Page_Load'は次のとおりです。リクエストごとに実行されます。 - hfid.Valueは、サンプルコードでは常に0に設定されます。さらに、これは依然としてクライアント側のボタンの切り捨てに依存しており、有効にするには時間がかかります(往復のコスト)。ポストバック時に値を保持し、リセットしないようにコードが修正されていても、無効にする前に複数回クリックすることができます。 – CoolBots

+0

いいえ、これはページロードが実行されるのを待つことはありません。試してみてください。クライアント側からは、ボタンをクリックしたときにそのボタンを無効にしています。 –

関連する問題