Можно ли разместить один конкретный элемент из списка с помощью Thymeleaf? - PullRequest
0 голосов
/ 28 августа 2018

В моем приложении Spring Boot у меня есть следующее RequestMapping:

@GetMapping("/test")
public String get(Model model) {
    List<CustomItem> items = itemService.findAll();
    model.addAttribute("items", items);
    return "test";
}

Я отображаю эти элементы в простой таблице HTML (одна строка для одного элемента).

Я бы хотел добавить кнопку в каждую строку, которая отправляет только соответствующую CustomItem конечной точке примерно так:

@PostMapping("/test")
public String post(CustomItem item) {
    // doing something with item
    return "redirect:/test";
}

Я пытался создать отдельный form для каждой строки:

<table>
 <tr th:each="item, stat : ${items}">
  <td>
   <form th:object="${items[__${stat.index}__]}" th:action="@{/test}" method="post">
    <input type="text" th:field="${items[__${stat.index}__].someField}">
    <button type="submit">Submit</button>
   </form>
  </td>
 </tr>
</table>

Но я получаю следующую ошибку при переходе на страницу:

Ни BindingResult, ни простой целевой объект для имени компонента 'items [0]' доступно как атрибут запроса

Я также попробовал следующее:

<table>
 <tr th:each="item, stat : ${items}">
  <td>
   <form th:object="${item}" th:action="@{/test}" method="post">
    <input type="text" th:field="*{someField}">
    <button type="submit">Submit</button>
   </form>
  </td>
 </tr>
</table>

В этом случае ошибка следующая:

Ни BindingResult, ни простой целевой объект для имени компонента 'item' доступно как атрибут запроса

Я не могу понять, что не так с моим подходом, поэтому я очень признателен за любой совет.

EDIT:

Как @ StefanEmanuelsson предположил, что я пытался опустить атрибут th:object:

<table>
 <tr th:each="item, stat : ${items}">
  <td>
   <form th:action="@{/test}" method="post">
    <input type="text" th:field="${items[__${stat.index}__].someField}">
    <button type="submit">Submit</button>
   </form>
  </td>
 </tr>
</table>

Таким образом, страница загружается просто отлично, но при отправке формы значение someField в полученном (?) CustomItem в контроллере равно null.

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Мне удалось решить эту проблему, просто используя атрибуты th:value и name вместо th:field:

<table>
 <tr th:each="item : ${items}">
  <td>
   <form th:action="@{/test}" method="post">
    <input type="text" th:value="${item.someField}" name="someField">
    <button type="submit">Submit</button>
   </form>
  </td>
 </tr>
</table>
0 голосов
/ 28 августа 2018

Это сработало для меня:

Создать экземпляр в контроллере и установить модель:

@GetMapping("/test")
public String get(Model model) {
    List<CustomItem> items = itemService.findAll();
    model.addAttribute("items", items);
    model.addAttribute("item", new CustomItem());
    return "test";
}

HTML:

<table>
        <tr th:each="i : ${items}">
            <form th:action="@{/test}" method="post" th:object="${item}">

                <td th:text="${i.id}" />
                <td th:text="${i.name}" />
            <td><input type="hidden" th:value="${i.id}" name="id" />
                <input type="hidden" th:value="${i.someField}" name="someField" />
                <button type="submit" name="action" value="remove">OK</button></td>
            </form>
        </tr>
    </table>

И создать метод в контроллере для обработки элемента:

@PostMapping("/test")
    public String test(@ModelAttribute CustomItem item,HttpServletRequest request) {
        doStuff(item);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...