Un problema Web comune è quando un utente fa clic più volte sul pulsante di invio di un modulo in modo che il server elabori il modulo più di una volta. Ciò può anche accadere quando un utente preme il pulsante Indietro dopo aver inviato un modulo e quindi viene elaborato nuovamente.Quali metodi sono disponibili per arrestare più postback di un modulo in ASP.NET MVC?
Qual è il modo migliore per impedire che ciò accada in ASP.NET MVC?
possibilità come la vedo io sono:
- disattivare il pulsante dopo aver presentare - questo ottiene intorno alle più clic, ma non la navigazione
- Avere l'azione di ricezione reindirizzare immediatamente - i browser sembrano lasciare queste redirezioni fuori della storia
- Posizionare un token univoco nella sessione e sulla forma - se corrispondono elaborare il modulo - se non cancellare il modulo per un nuovo presentare
Ce ne sono altri?
Esistono alcune implementazioni specifiche di uno di questi?
Riesco a vedere la terza opzione implementata come ActionFilter con un'estensione HtmlHelper in modo simile a quella anti-contraffazione.
In attesa di sentire da voi MVC fuori là.
Idea interessante, una cosa che vorrei aggiungere è che dovresti inserire la sequenza in una transazione: 1) controlla nonce 2) processo 3) cancella nonce. Se non lo fai atomicamente hai una condizione di gara in cui il post può essere elaborato più volte, esp. se l'elaborazione richiede un po 'di tempo per finire (e l'utente è impaziente). Una cosa su cui non sono ancora chiaro è se il POST rileva una duplicazione, cosa deve essere restituito all'utente? Una pagina che indica che il post è in corso? – DSO
Prima cancellerei la chiave nonce e poi eseguirò l'elaborazione per mantenere le cose semplici. Come gestire un dupe è una decisione di progettazione e fino a voi. Tuttavia, una risposta descrittiva di ciò che è appena successo potrebbe aiutare l'utente ad apprezzare ancora di più la tua app Web. – aleemb
Hai mai visto un'implementazione di chiavi nonce in ASP.NET MVC utilizzando ActionFilters? Posso immaginare che ciò renderebbe l'implementazione molto semplice e riutilizzabile. Potrebbe anche utilizzare un DB o semplicemente una variabile di sessione. – WooWaaBob