提交表格,表格中仅包含选定的模型属性(Spring Boot + Thymeleaf)

时间:2018-10-24 14:29:27

标签: spring thymeleaf

这就是我想要做的:

  1. 我有一个带表的表,其中显示了模型属性,该属性是对象列表。我使用“ th:each”将它们显示在表格行中
  2. 在每一行中,我都会显示一个复选框,目的是标记所显示的某些表行
  3. 我要提交表单并仅发布选定模型属性的列表(仅选定表行中的那些属性)

这是我在表格行中显示对象的模型属性列表的方式(我跳过了代码的不相关部分):

<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;
    .....
}

我使用与“ form”标记内的th:object相同的对象,这是提交表单后我要传递给后端控制器的列表,除了该列表应仅包含我在表行中打钩的对象复选框。

2 个答案:

答案 0 :(得分:0)

首先,请确保您的整个表格以相同的格式包含(请注意,此代码均未经过测试):

<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>

然后,在控制器端,您需要一个自定义数据绑定器,将ID列表转换为域对象。

@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 ...;
 }

答案 1 :(得分:0)

您可以通过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
  }
}