71 votes

Comment empêcher la soumission multiple de formulaires dans .NET MVC sans utiliser Javascript ?

Je veux empêcher les utilisateurs de soumettre des formulaires plusieurs fois dans .NET MVC. J'ai essayé plusieurs méthodes en utilisant Javascript, mais j'ai eu des difficultés à le faire fonctionner dans tous les navigateurs. Alors, comment puis-je empêcher cela dans mon contrôleur ? Existe-t-il un moyen de détecter les soumissions multiples ?

0 votes

0 votes

La plupart des réponses ci-dessous concernent l'utilisation de l'identifiant de formulaire. Voir ceci pour définir l'identifiant du formulaire : stackoverflow.com/q/2854616/3885927

0voto

Lorenzo Points 12167

Ne réinventez pas la roue :)

Utilisez le Poster/Rediriger/Retrouver modèle de conception.

Vous trouverez ici un question et une réponse donnant quelques suggestions sur la façon de l'implémenter dans ASP.NET MVC.

0voto

Abraham John Points 1

Cela fonctionne sur tous les navigateurs

 document.onkeydown = function () {
        switch (event.keyCode) {
            case 116: //F5 button
                event.returnValue = false;
                event.keyCode = 0;
                return false;
            case 82: //R button
                if (event.ctrlKey) {
                    event.returnValue = false;
                    event.keyCode = 0;
                    return false;
                }
        }
    }

0voto

Jim Berg Points 469

Pour ce faire, vous pouvez créer une sorte de drapeau d'entrée statique spécifique à l'utilisateur ou à la manière dont vous souhaitez protéger la ressource. J'utilise un ConcurrentDictionary pour suivre les entrées. La clé est essentiellement le nom de la ressource que je protège combiné à l'ID de l'utilisateur. L'astuce consiste à trouver comment bloquer la requête lorsque vous savez qu'elle est en cours de traitement.

public async Task<ActionResult> SlowAction()
{
    if(!CanEnterResource(nameof(SlowAction)) return new HttpStatusCodeResult(204);
    try
    {
        // Do slow process
        return new SlowProcessActionResult();
    }
    finally
    {
       ExitedResource(nameof(SlowAction));
    }
}

Le renvoi d'un 204 est une réponse à la demande de double-clic qui ne fera rien du côté du navigateur. Lorsque le processus lent est terminé, le navigateur reçoit la réponse correcte à la demande initiale et agit en conséquence.

0voto

Nijas Hameed Points 1

Utilisez ce simple champ d'entrée jquery et il fonctionnera à merveille même si vous avez plusieurs boutons d'envoi dans un seul formulaire.

$('input[type=submit]').click(function () {
    var clickedBtn = $(this)
    setTimeout(function () {
        clickedBtn.attr('disabled', 'disabled');
    }, 1);
});

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X