web-dev-qa-db-ja.com

他の変数からthymeleaf th:field値を設定する方法

単純なテキスト入力フィールドがあり、あるオブジェクトのデフォルト値を設定し、その最終値を別のオブジェクトに保存する必要があります。次のコードは機能していません。

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

フォームはDTOオブジェクトであり、クライアントはデータベースのエンティティオブジェクトです。

この状況を解決する正しい方法は何ですか?

動作しないということは、つまり、初期値がclient.name = "Foo"およびform.clientName = nullであると言えます。入力フィールドの表示値が「Foo」であり、フォーム送信後にform.clientName値が「Foo」になる必要があります。ただし、入力フィールドには何も表示されず、送信時にはform.clientNameの値はまだnullです。

興味のある方は、次の構造を使用してこの問題を解決してください(別の質問で答えを見つけました)。

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

この方法にアプローチできます。

th:fieldを使用する代わりに、html idnameを使用します。 th:valueを使用して値を設定します

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

これがあなたを助けることを願っています

42
Newbie

フォームの価値を維持したままページに戻る必要がない場合は、次のようにすることができます。

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

それはある種の魔法です。

  • 値= client.nameを設定します
  • フォームの値を「名前」フィールドとして送り返します。したがって、フォームフィールド「clientName」を「name」に変更する必要があります。

ユーザー入力の間違いがあるページに戻るなど、フォームの入力値を保持することが重要な場合は、次のようにする必要があります。

<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}"/>

ということは:

  • フォームフィールド名は「name」です
  • 値は、存在する場合はフォームから取得され、存在しない場合はクライアントBeanから取得されます。これは、ページの最初の到着と初期値を一致させ、エラーがある場合はフォームの入力値を照合します。

クライアントBeanをフォームBeanにマップする必要はありません。そして、フォームを送信すると、値はnullではなく「」(空)になるため、機能します

1
Julien Feniou

正しいアプローチは、 前処理 を使用することです

例えば

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

0
Tamb