2010-08-27 19 views
7

Semplice qui ... c'è un modo pulito per impedire a un utente di fare doppio clic su un pulsante in un modulo Web e causare così la duplicazione degli eventi?Prevenire il postback duplicato in ASP.Net (C#)

Se per esempio avevo un modulo di commento e l'utente digita "questo è il mio commento" e fa clic su Invia, il commento è mostrato sotto ... tuttavia se si fa doppio clic, si fa triplo clic o si impazziscono la tastiera possono causare più versioni da pubblicare.

lato client ho potuto abbastanza facilmente disattivare il pulsante onclick - ma io preferisco le soluzioni lato server per cose come questa :)

C'è un timeout postback per ViewState che può essere impostato per esempio?

Grazie

risposta

2

Non penso che dovresti caricare il server per compiti banali come questi. Si potrebbe provare un po 'di soluzione di blocco dell'interfaccia utente jquery come this uno. Anche il toolkit Microsoft Ajax dovrebbe avere un controllo che faccia lo stesso. L'avevo usato molto tempo fa, non riesco a ricordare il nome del controllo però.

+0

Punto giusto, lato client lo è! Il collegamento – isNaN1247

+0

sembra essere morto. –

1

Impostare una variabile di sessione quando l'utente entra nella pagina come Session [ "FormXYZSubmitted"] = false. quando il modulo viene inviato controllare che variabile come

if((bool) Session["FormXYZSubmitted"] == false) { 
    // save to db 
    Session["FormXYZSubmitted"] = true; 
} 
+0

lo si può fare sul pulsante evento click pure per essere precisi –

+0

Non l'ho incluso ma è corretto. – Zafer

0

ho avuto lo stesso scenario. La soluzione di uno dei miei colleghi era di implementare una sorta di Timer in Javascript, per evitare di considerare il secondo clic come un clic.

Speranza che aiuta,

0

Disabilitare il pulsante su clic, utilizzare jquery o microsoft ajax toolkit.

0

A seconda di quanto questo sia importante per voi, potrebbe creare una matrice di una volta GUID di cui si rimuove dalla matrice una volta che l'aggiornamento è stato elaborato (cioè pubblicato nel ViewState/campo nascosto)

Se il GUID non è nell'array sul postback, la richiesta non è valida.

Tabella del database sostitutiva per array in un ambiente cluster.

0

Il lato client può essere complicato se si utilizza la convalida di Asp.Net.

Se si dispone di una pagina master, mettere questo nella pagina master:

void IterateThroughControls(Control parent) 
    { 
     foreach (Control SelectedButton in parent.Controls) 
     { 
      if (SelectedButton is Button) 
      { 
       ((Button)SelectedButton).Attributes.Add("onclick", " this.disabled = true; " + Page.ClientScript.GetPostBackEventReference(((Button)SelectedButton), null) + ";"); 
      } 

      if (SelectedButton.Controls.Count > 0) 
      { 
       IterateThroughControls(SelectedButton); 
      } 
     } 
    } 

Poi aggiungere questo alla pagina master Page Load:

IterateThroughControls(this); 
Problemi correlati