2009-08-27 5 views
1

J'ai plusieurs formulaires (l'utilisateur peut ajouter un nouveau formulaire dynamiquement) dans une page, ils sont tous soumis à la même action struts2. Je dois soumettre tous ces formulaires lorsque l'utilisateur clique sur le bouton Enregistrer.

Tout va bien dans FF. Mais dans IE et Google Chrome, seul le dernier formulaire est soumis.Soumission de formulaires multiples dans IE et Google Chrome

Toute aide est appréciée. Je vous remercie.

Les éléments de chaque formulaire sont les mêmes, un formulaire un objet. Les données de chaque formulaire seront ajoutées à un objet de domaine, puis l'objet sera conservé dans DB.

fonction JavaScript pour gérer opération de sauvegarde:

<script type="text/javascript" > 
    function submit() { 
     var formCnt = document.getElementById('formCnt').value; 
     for(var i = 1; i <= formCnt; i++) { 
      var formName = 'form' + i; 
      document.forms[formName].submit(); 
     } 
    } 
</script> 
... 
<input type="hidden" id="formCnt" name="formCnt" value="5" /> 

<form action="add.htm" name="form1" id="form1" method="post" enctype="multipart/form-data" /> 
    <input type="text" name="item.price" id="item.price" value="" /> 
    ... 
</form> 

<form action="add.htm" name="form2" id="form2" method="post" enctype="multipart/form-data" /> 
    <input type="text" name="item.price" id="item.price" value="" /> 
    ... 
</form> 

    ... 

<form action="add.htm" name="form5" id="form5" method="post" enctype="multipart/form-data" /> 
    <input type="text" name="item.price" id="item.price" value="" /> 
    ... 
</form> 

    ... 
+0

Par "ça marche dans FF" je suppose que vous voulez dire que les données sont enregistrées dans la base de données? Vous ne recevez pas tout le contenu de toutes les formes dans la même action en une seule fois, n'est-ce pas? – deceze

+0

Il n'y a qu'une seule action Struts nommée AddAction, les formulaires sur la page sont tous soumis à AddAction. Donc, je ne peux pas utiliser des noms de champs différents dans la page jsp comme vous pouvez le voir dans le src html ci-dessus. Je pense à essayer la soumission asynchrone en utilisant XHR. J'espère que cela fonctionnerait. Merci pour votre réponse détaillée. – user163970

+0

Vous n'avez aucun contrôle sur le script côté serveur? BTW, voter et accepter les boutons sont la façon préférée de donner merci. : o) – deceze

Répondre

0

Vous ne devriez être en mesure de présenter une forme à la fois. Un bouton de soumission doit figurer à l'intérieur des balises <form>, et seul le formulaire dans lequel le bouton de soumission se trouve doit être soumis. Cette balise cachée input devrait être à l'intérieur d'une balise de formulaire ainsi que BTW.

Même lorsqu'il le fait via JS, un submit() initie une nouvelle demande POST au serveur. Vous ne pouvez faire qu'une seule demande à la fois, c'est pourquoi seul le dernier s'affiche. Je ne sais pas pourquoi cela fonctionnerait en FF.

Si vous avez tout de suite à soumettre tout de suite, pourquoi le rompre pour commencer? Si vous voulez "sous-sections" dans un formulaire, vous pouvez utiliser les balises <fieldset>.

Modifier

Qu'est-ce qui se passe lorsque vous exécutez votre script est le même que si tous vos formulaires ont un bouton d'envoi, et vous cliquez sur tous les boutons soumet pour rapide. En cliquant sur un bouton d'envoi envoie les données de ce formulaire au serveur dans une demande POST et actualise la page. Si vous êtes assez rapide pour cliquer sur un autre bouton avant l'actualisation de la page, vous pouvez soumettre un autre formulaire, l'ancienne demande sera annulée. La seule façon dont je peux imaginer comment les données de toutes les formes pourraient éventuellement arriver au serveur de la façon dont vous le faites est si la demande est envoyée avant que le prochain submit() soit déclenché. Essentiellement, vous dépendez de la lenteur du navigateur, ou du moins de la gestion de la requête avant de poursuivre l'exécution du script. Apparemment, cela fonctionne en FF, mais échoue dans d'autres navigateurs. Comme il se doit.

Edit 2

Si vous devez soumettre plusieurs champs avec le même nom, utilisez une forme et donner à vos champs noms uniques. Le meilleur schéma de nommage dépend de la façon dont votre backend gère les soumissions.

  • item0, item1
  • item.0, item.1
  • Model.0.item, Model.1.item
0

Je crois que vous êtes seulement autorisé à présenter un seul à la fois - cela pourrait être une mauvaise pratique, mais comment à propos de dupliquer fondamentalement chaque code de formulaire et de le répliquer dans un iframe, en soumettant le formulaire là-bas, soit en se basant sur XHR ($ .post) pour imiter ce que les formulaires feraient.

0

essayez d'utiliser document.getElementById(formId).submit(); à la place. Les méthodes document.form.x, document.forms [int], document.forms [id] et document.x d'accès aux formulaires ne sont pas des méthodes de référencement d'un formulaire compatibles avec tous les navigateurs.

Aussi - Je crois que j'ai déjà eu un problème quand j'avais à la fois un nom et un identifiant sur mon formulaire. La meilleure pratique consiste à utiliser un identifiant je crois.

+0

Essayé getElementById, ne fonctionne toujours pas. Je vais pour la solution Ajax, merci. – user163970

Questions connexes