0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Thymeleafでformタグを入れ子にしたいときの対処法とデータの受け渡し方

Posted at

やりたいこと

  • 下記画面に個別削除機能をつけたい
    FireShot Capture 003 - User - localhost.png

  • その際のHTMLのテーブルのソースコードは以下の通り

<table th:if="!${#lists.isEmpty(userList)}">
    <thead>
    <tr>
        <th>ID</th>
        <th>ユーザ名</th>
        <th>削除</th>
    </tr>
    </thead>
    <tbody>
    <tr th:each="user:${userList}">
        <td th:text="${user.userId}"></td>
        <td th:text="${user.name}"></td>
        <td>
            <form th:action="@{/user/delete}" method="post">
                <input type="hidden" name="userId" th:value="${user.userId}">
                <input type="submit" value="削除">
            </form>
        </td>
    </tr>
    </tbody>
</table>

躓いたところ

  • 最初は下記のようなコードにしようと思っていた
  • しかしHTMLの仕様でformタグは入れ子にできない制約がある
<div th:if="!${#lists.isEmpty(userList)}">
<form th:action="@{/user/deleteAll}" method="post" th:object="${deleteForm}">
<table>
    <thead>
    <tr>
        <th>選択</th>
        <th>ID</th>
        <th>ユーザ名</th>
        <th>削除</th>
    </tr>
    </thead>
    <tbody>
    <tr th:each="user:${userList}">
        <td>
            <input type="checkbox" th:value="${user.userId}" th:field="*{deleteList}">
        </td>
        <td th:text="${user.userId}"></td>
        <td th:text="${user.name}"></td>
        <td>
            <form th:action="@{/user/delete}" method="post">
                <input type="hidden" name="userId" th:value="${user.userId}">
                <input type="submit" value="削除">
            </form>
        </td>
    </tr>
    </tbody>
</table>
<input type="submit" value="選択したものを一括削除">
</form>
</div>

解決策

  • inputタグにform属性を追加して対応するformタグのid属性に同じものを指定するとformタグ内にないinputタグのボタンクリックを処理することができる
  • またThymeleafでinputタグの値をオブジェクトに渡したいとき通常formタグにth:objectを指定してinputタグのth:feiledでどのメンバ変数に値を格納するか*{メンバ変数名}のような形で指定するが今回の場合はform配下に対象のinputタグがないため下記のようにth:fieldは省略しない形で書くと指定したメンバ変数に値を格納できる
<div th:if="!${#lists.isEmpty(userList)}">
<table>
    <thead>
    <tr>
        <th>選択</th>
        <th>ID</th>
        <th>ユーザ名</th>
        <th>削除</th>
    </tr>
    </thead>
    <tbody>
    <tr th:each="user:${userList}">
        <td>
            <input form="deleteListForm" type="checkbox" th:value="${user.userId}" th:field="${deleteForm.deleteList}">
        </td>
        <td th:text="${user.userId}"></td>
        <td th:text="${user.name}"></td>
        <td>
            <form th:action="@{/user/delete}" method="post">
                <input type="hidden" name="userId" th:value="${user.userId}">
                <input type="submit" value="削除">
            </form>
        </td>
    </tr>
    </tbody>
</table>
<form id="deleteListForm" th:action="@{/user/deleteAll}" method="post">
    <input type="submit" value="選択したものを一括削除">
</form>
</div>

ソースコード

  • 今回作成したソースコード

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?