web-dev-qa-db-fra.com

Comment passer deux objets à utiliser sous une forme utilisant thymeleaf?

Mon problème est le suivant: 

J'ai 2 objets différents à remplir à partir d'un seul formulaire. 

Avec 1 objet, je fais simplement dans le newFoo.html: 

<form th:object="${foo} th:action="@{/foo}" method="post">
    <input type="text" th:field="*{name}"/>
    <button type="submit">Go</button>
</form>

et dans le FooController: 

@RequestMapping(value = "/foo/new", method = RequestMethod.GET) 
public String newFoo(final Foo foo, Model model) { 
    return "newFoo"; 
} 

@RequestMapping(value = "/foo/new", method = RequestMethod.POST) 
public String saveFoo(final Foo foo, final BindingResult bindingResult, Model model) { 
    fooService.save(foo); 
    return "redirect:/foo/new"; 
} 

Disons que j'ai une autre barre d'objets avec une variable "status". Comment puis-je faire pour transmettre cet objet afin que je puisse soumettre l'entrée dans le même formulaire? 

Comme: 

<form th:object="${foo} && ${bar}" th:action="@{/foo}" method="post">
    <input type="text" th:field="*{name}"/>
    <input type="text" th:field="*{status}"/>
    <button type="submit">Go</button>
</form>

Jusqu'ici j'ai essayé de faire avec fieldset avec un th: object dedans, ça ne marche pas, j'ai essayé de mettre deux th: object dans le formulaire, ça ne marche pas non plus. 

La seule façon que j'ai trouvée est de construire un autre objet contenant ces deux objets et de le transmettre. Cela fonctionne bien, mais je ne peux pas créer ce genre d'objet, c'est un non-sens (même si cela fonctionne). 

Bien sûr, les objets ne sont pas aussi simples que Foo et Bar ici, sinon je les fusionnerais. Mais ce n'est pas quelque chose que je peux faire. 

Est-il même possible de passer deux objets comme celui-là à utiliser dans un formulaire? 

Merci déjà. 

15
brnrd

Je ne pense pas que vous deviez utiliser deux th:objects. Il suffit d'utiliser th:value

<form th:action="@{/foo}" method="post">
      <input type="text" th:value="${foo.name}" name="name"/>
      <input type="text" th:value="${bar.status}" name="status"/>
      <button type="submit">Go</button>
</form>

Je pense que Spring est assez intelligent, du côté du contrôleur, pour utiliser ses techniques de cartographie afin de mapper vos champs sur leur propre objet de commande, foo ou bar.

19

j'ai utilisé une balise div pour entourer l'entrée de formulaire de mon deuxième objet et ajouté un th: object ..... le contrôleur l'a traitée et l'a ajoutée à la base de données. 

<form method=post th:object="${object1}" >
   <div th:object="${object2}" >

      code......

   </div> 
   <input type="submit" />
</form>
1
KevinG