如何使用 Thymeleaf 创建可点击项目列表

How to create a list of clickable items using Thymeleaf

在我的 Spring Boot web 应用程序中,我需要使用 Thymeleaf 创建项目列表,在其中单击并提交项目会将其值发送到我的控制器,如下所示:

@PostMapping({"/mylist"})
public ModelAndView postList(@RequestParam(value = "item") String item) {
    ModelAndView mav = new ModelAndView("mylist");
    mav.addObject("items", someRepository.findAll());
    ...
    return mav;
}

请注意,控制器采用 item 参数。

为了比较,下面的 Thymeleaf 下拉列表 按预期执行,因为当我从下拉列表中 select 一个项目,然后单击提交时,上面的控制器接收到商品价值:

<form th:action="@{/mylist}" method="post">
    ...
    <div>
        <select th:name="item">
            <option th:each="item : ${metaqueryitems}"
                    th:value="${item.code}"
                    th:selected="${item.id eq item}"
                    th:text="${item.id}"></option>
        </select>
        <td><input type="submit" th:value="Submit"/></td>
    </div>
    ...
</form>

但我不想显示下拉列表,而是想在常规 非下拉列表 中显示项目,例如:

<form th:action="@{/mylist}" method="post">
    ...
    <div th:name="item" th:each="item : ${items}">
        <input type="submit" th:value="${item.code}"/>
    </div>
    ...
</form>

但是,当我单击上面列表中的项目时,控制器总是以 item 参数的空值结束。

如何将 th:each 样式的 Thymeleaf 列表中的值发送到我的控制器?

您可以将 name="item" 添加到每个 <input> 元素:

<div th:each="item : ${metaqueryitems}">
    <input type="submit" name="item" th:value="${item.code}"/>
</div>

请注意,因为 item 只是一个文字字符串,所以这里不需要使用 th:name=...。您可以只使用 name=....


请注意:在表单中,您通常希望确保每个输入元素都有一个唯一的 name 值,以便您知道哪个用户输入的值来自哪个输入元素。

<form action="..." method="post">
    <input type="text" name="firstname" id="firstname">
    <input type="text" name="lastname"  id="lastname">
</form>

在这种非常特殊的情况下,您可以使用相同的名称 (item) 摆脱它们,因为您一次只能提交一个非空值。