Le formulaire de rappel de la Bootbox ne fonctionne pas correctement

Je crée dynamicment des formulaires et j’utilise bootbox 4 avec bootstrap 3 et jquery 3.1.0 dans une application MVC5.

Edit: J’ai mis à jour jQuery de mon projet de 1.10.2 à 3.1.0, toujours le même problème ci-dessous.

Utilisation: cliquez sur remove, bootbox confirme la suppression via modal et, si elle est confirmée, appelez l’action .submit () sur le formulaire.

Capture d’écran de l’application

Le problème: je clique sur le bouton de suppression et un modal apparaît pour confirmer l’action, et je clique sur «continuer», mais cela ne fait rien. Il semble n’y avoir qu’une seule action de soumission active parmi tous les éléments de formulaire. Je peux donc appeler avec succès submit sur un élément par rafraîchissement de page.

Je suis nouveau dans le javascript, j’ai donc une compréhension de base pour le moment et j’essaie de comprendre ce que je fais mal avec mon code ci-dessous. Toute aide serait appréciée.

Mon code de vue :

@foreach (var user in Model.Users) {   @user.Id   @user.FirstName @user.LastName   @Html.CheckBox("role", user.IsAdmin)   @using (Html.BeginForm("UpdateUserRole", "Admin", FormMethod.Post, new {@class = "btn-inline"})) { @Html.Hidden("id", user.Id) @Html.Hidden("role", user.GetRole(user.IsAdmin))  } @using (Html.BeginForm("RemoveUser", "Admin", FormMethod.Post, new {@class = "btn-inline", @id=user.Id+"Form"})) { @Html.Hidden("id", user.Id)  }   } 

Mon script (ajouté au bas de la vue) :

 @section scripts {  $(function () { $('form').on('click','button.buttonElement',function (e) { var user = $(this).attr("data-user-id"); e.preventDefault(); bootbox.dialog({ message: "Do you want to continue ?", title: "Remove User", buttons: { main: { label: "Cancel", className: "btn btn-default", callback: function () { return true; } }, success: { label: "Continue", className: "btn btn-default", callback: function () { $('#'+user+'Form').submit(); } } } }); }); });  } 

Edit : Voici quelques sorties HTML:

 
Joe Joe Cuevas

Edit: Solution

Il s’est avéré que modelstate remplaçait la valeur id de tous les formulaires générés par la boucle foreach à partir de View, sur la sortie HTML finale. Ceci explique pourquoi tous les symptômes ci-dessus se produisaient. J’ai simplement ajouté le code suivant à mon contrôleur avant de renvoyer mon viewModel et il a été corrigé: ModelState.Remove (“id”);

table / tr / td / form est une amende, dans la mesure du possible. Vous pouvez probablement simplifier le déclenchement du formulaire d’envoi avec:

 $('form').on('click','button.buttonElement',function (e) { var user = $(this).attr("data-user-id"); var form = $(this).closest('form'); // <-- add this e.preventDefault(); bootbox.dialog({ message: "Do you want to continue ?", title: "Remove User", buttons: { main: { label: "Cancel", className: "btn btn-default", callback: function () { return true; } }, success: { label: "Continue", className: "btn btn-default", callback: function () { form.submit(); // <-- change this } } } }); }); 

Vous pouvez également simplement utiliser la fonction bootbox.confirm . Si vous voulez un texte de bouton personnalisé, suivez le deuxième exemple ici , comme ceci.

 $('form').on('click','button.buttonElement',function (e) { var user = $(this).attr("data-user-id"); var form = $(this).closest('form'); // <-- add this e.preventDefault(); bootbox.confirm({ message: "Do you want to continue ?", title: "Remove User", buttons: { cancel: { label: "Cancel", className: "btn btn-default" }, confirm: { label: "Continue", className: "btn btn-default" } }, callback: function(result) { if(result == true) { form.submit(); } } }); }); 

Vous voudrez peut-être prendre en compte le fait qu'un utilisateur peut déclencher la soumission du formulaire sans cliquer sur le bouton Continuer, auquel cas la demande de suppression se produira sans confirmation.

De plus, Bootbox n'a pas encore été confirmé pour fonctionner avec jQuery 3.x , bien que cela dépende davantage de la version de la bibliothèque Bootstrap parente - vous devez effectuer une mise à niveau vers Bootstrap 3.3.7 si vous avez mis à niveau vers jQuery 3.x.