这就是我想要做的:
这是我在表格行中显示对象的模型属性列表的方式(我跳过了代码的不相关部分):
<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相同的对象,这是提交表单后我要传递给后端控制器的列表,除了该列表应仅包含我在表行中打钩的对象复选框。
答案 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
}
}