Отправить форму только с выбранными атрибутами модели внутри таблицы (Spring Boot + Thymeleaf) - PullRequest
0 голосов
/ 24 октября 2018

Вот что я пытаюсь сделать:

  1. У меня есть таблица с атрибутом модели, представляющим собой список объектов.Я представляю их в строках таблицы, используя «th: each»
  2. . В каждой строке я ставлю флажок, намереваясь отметить некоторые из представленных строк таблицы
  3. Я хочу отправить форму и POSTтолько список выбранных атрибутов модели (только те, что в выбранных строках таблицы)

Вот так я представляю список атрибутов модели объектов внутри строк таблицы (я пропустил ненужные части кода):

<form class="form-horizontal"
    th:action="@{'/supplier/define'}"
    th:object="${foundSuppliers}" th:method="POST">

.....
<tr th:each="supplier, iterStat : ${foundSuppliers.suppliersDTO}">
    <td class="hide" th:text="${supplier.id}">ID</td>
    <td th:text="${supplier.name}">Name</td>
    <td><input th:id="'chk_' + ${supplier.id}"
            type="checkbox" th:field="*{foundSuppliers.suppliersDTO}" th:value="${supplier}">
    </td>
</tr>

Когда я отправляю эту форму, мой список "foundSuppliers.suppliersDTO" пуст, хотя я проверяю хотя бы одну строку в своей таблице.

Мой метод контроллера за указанным th: action (тега "form"):

public String defineSuppliers(@ModelAttribute SupplierListDTO foundSuppliers, Model model) { 
... 
}

Что мне нужно сделать, чтобы заполнить файл foundSuppliers.suppliersDTO списком объектов, помеченных флажком?

Чтобы уточнить, «foundSuppliers» - это атрибут модели, который я передаю от контроллера, и он содержит список поставщиков.Класс, который я передаю как "foundSuppliers", выглядит следующим образом:

public class SupplierListDTO {
    private List<SupplierDTO> suppliersDTO;
    .....
}

И я использую тот же, что и th: object внутри тега "form", это список, который я хочу передать в бэкэнд-контроллер, когдаФорма отправлена, за исключением того, что список должен содержать только те объекты внутри строк таблицы, где я поставил галочку.

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Вы можете сделать это либо через JavaScript, либо через Spring Boot.Возможно, самый простой способ - дать вашему полю-флажку имя и затем получить его через контроллер.Таким образом, вы можете легко проверить, является ли значение этого имени / флажка нулевым или нет.Вы должны придумать что-то вроде этого:

@RequestMapping(value = "/supplier" , method = RequestMethod. POST)
public void getSuppliers(@RequestParam(value = "nameOfCheckBoxInThymeleaf", required = false) String checkboxValue) 
{
  if(checkboxValue != null)
  {
    // do some logic here - get a list of selected suppliers for example
  }
  else
  {
   // do some logic here
  }
}
0 голосов
/ 24 октября 2018

Во-первых, убедитесь, что вся ваша таблица заключена в одну и ту же форму (учтите, что ни один из этих кодов не был проверен):

<form action="/....." method="POST">
<tr th:each="supplier : ${foundSuppliers}">
  <td class="hide" th:text="${supplier.id}">ID</td>
  <td th:text="${supplier.name}">Name</td>
  <td><input th:id="'chk_' + ${supplier.id}" type="checkbox"></td>
</tr>
</form>

Затем, на стороне контроллера, вам нужны пользовательские данныеbinder преобразует список идентификаторов в объекты вашего домена.

@Component
public class IdToSupplierConverterFactory
implements ConverterFactory<String, Supplier> {
    private static class IdToSupplierConverter<Supplier> 
      implements Converter<String, Supplier> {

       @PersistenceContext
       private EntityManager em;

        public Supplier convert(String id) {
            return em.findById(id, Supplier.class);
        }
    }

    @Override
    public <Supplier> Converter<String, Supplier> getConverter(
      Class<Supplier> targetType) {
        return new IdToSupplierConverter();
    }
}

Spring сделает все остальное и сопоставит ваши параметры с:

 @PostMapping("/......")
 public YourType myControllerMethod(@RequestParam List<Supplier> suppliers) {
   return ...;
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...