web-dev-qa-db-fra.com

Comment définir thymeleaf th: valeur de champ à partir d'une autre variable

J'ai un simple champ de saisie de texte dans lequel je dois définir la valeur par défaut d'un objet et enregistrer sa valeur finale dans un autre. Le code suivant ne fonctionne pas.

<div th:object="${form}">
    <input class="form-control"
           type="text"
           th:value="${client.name}"  //this line is ignored
           th:field="*{clientName}"/>
</div>

form est un objet DTO et client est un objet Entity de la base de données.

Quelle est la bonne façon de résoudre cette situation?

En ne travaillant pas, je veux dire - disons que les valeurs initiales sont client.name = "Foo" et form.clientName = null . J'ai besoin que la valeur d'affichage du champ d'entrée soit "Foo" et que, après la soumission du formulaire, la valeur form.clientName devienne "Foo". Mais le champ de saisie n'affiche rien et lors de la soumission, la valeur form.clientName est toujours nulle.

Si quelqu'un est intéressé, a résolu ce problème en utilisant la structure suivante (trouvé la réponse dans une autre question).

th:attr="value = ${client.name}"
29
Tobou

Vous pouvez aborder cette méthode.

Au lieu d'utiliser th:field, utilisez html id & name. Définir la valeur en utilisant th:value

<input class="form-control"
           type="text"
           th:value="${client.name}" id="clientName" name="clientName" />

J'espère que ceci vous aidera

34
Newbie

Si vous n'êtes pas obligé de revenir sur la page en conservant la valeur du formulaire, vous pouvez le faire: 

<form method="post" th:action="@{''}" th:object="${form}">
    <input class="form-control"
           type="text"
           th:field="${client.name}"/>

C'est une sorte de magie:

  • il va définir la valeur = client.name
  • il renverra la valeur sous la forme, en tant que "nom". Donc, vous devrez changer le champ de votre formulaire, 'clientName' en 'name'

Si vous souhaitez conserver les valeurs d'entrée du formulaire, comme un retour sur la page avec une erreur de saisie de l'utilisateur, vous devrez le faire:

<form method="post" th:action="@{''}" th:object="${form}">
    <input class="form-control"
           type="text"
           th:name="name"
           th:value="${form.name != null} ? ${form.name} : ${client.name}"/>

Cela signifie :

  • Le nom du champ de formulaire est 'name'
  • La valeur provient du formulaire s'il existe, sinon du bean client. Ce qui correspond à la première arrivée sur la page avec la valeur initiale, puis les formulaires saisissent des valeurs en cas d'erreur. 

Sans avoir à mapper votre haricot client à votre haricot de formulaire. Et cela fonctionne car une fois que vous avez soumis le formulaire, la valeur n’est pas nulle mais "" (vide)

1
Julien Feniou

La bonne approche consiste à utiliser prétraitement

Par exemple

th:field="*{__${myVar}__}"

0
Tamb