如何在Spring Boot Controller中获取复选框参数?
问题描述
我有多个复选框,想要在Controller中获取它们的参数,但尝试编写的代码无法正常运行。以下是我的相关代码:
HTML代码
<input type="checkbox" th:each="formfrequencylist : ${formfrequencylist}" th:value="${formfrequencylist.id}" th:text="${formfrequencylist.frequencyNm}" th:field="${formFrequency.id}" >
Controller代码
@PreAuthorize("hasRole('ROLE_ADMIN')") @GetMapping( value = "create/") public String create( Model model) { RegulatoryForm regulatoryform=new RegulatoryForm(); ActHasForm acthasform=new ActHasForm(); FormFrequency formFrequency = new FormFrequency(); List<RegulatoryAct> actlist=atiServiceImpl.findAllRegulatoryAct(); List<FormFrequency> formfrequencylist=atiServiceImpl.findAllFormFrequency(); model.addAttribute("actlist",actlist); model.addAttribute("regulatoryform",regulatoryform); model.addAttribute("acthasform",acthasform); model.addAttribute("formFrequency",formFrequency); model.addAttribute("formfrequencylist",formfrequencylist); return "regulatoryform/create"; } @PreAuthorize("hasRole('ROLE_ADMIN')") @PostMapping(value = "create/") public String create(@ModelAttribute("regulatoryform") RegulatoryForm regulatoryform,@ModelAttribute("acthasform")ActHasForm acthasform,@ModelAttribute("formFrequencylist")List <FormFrequency> formFrequencylist) { FormHasFrequency formHasFrequency=new FormHasFrequency(); atiServiceImpl.saveRegulatoryForm(regulatoryform); acthasform.setFormId(regulatoryform); atiServiceImpl.saveActHasForm(acthasform); for (FormFrequency form:formFrequencylist) { formHasFrequency.setFormId(regulatoryform); formHasFrequency.setFrequencyId(form); atiServiceImpl.saveFormHasFrequency(formHasFrequency); } return "redirect:/regulatoryform/"; }
修复方案
1. 修正Thymeleaf复选框绑定逻辑
当前所有复选框都绑定到formFrequency.id这个单值属性,无法传递多选结果。需要改为绑定到集合属性:
- 先在
RegulatoryForm类中添加选中ID的集合属性:
public class RegulatoryForm { // 原有属性保留 private List<Long> selectedFrequencyIds; // 生成getter、setter方法 public List<Long> getSelectedFrequencyIds() { return selectedFrequencyIds; } public void setSelectedFrequencyIds(List<Long> selectedFrequencyIds) { this.selectedFrequencyIds = selectedFrequencyIds; } }
- 修改HTML复选框代码:
<input type="checkbox" th:each="freq : ${formfrequencylist}" th:value="${freq.id}" th:text="${freq.frequencyNm}" th:field="*{selectedFrequencyIds}" >
2. 调整Controller参数接收与处理逻辑
无需单独接收formFrequencylist,直接从regulatoryform中获取选中的ID列表,同时避免循环复用同一个实体实例:
@PreAuthorize("hasRole('ROLE_ADMIN')") @PostMapping(value = "create/") public String create(@ModelAttribute("regulatoryform") RegulatoryForm regulatoryform, @ModelAttribute("acthasform") ActHasForm acthasform) { atiServiceImpl.saveRegulatoryForm(regulatoryform); acthasform.setFormId(regulatoryform); atiServiceImpl.saveActHasForm(acthasform); List<Long> selectedIds = regulatoryform.getSelectedFrequencyIds(); if (selectedIds != null && !selectedIds.isEmpty()) { for (Long freqId : selectedIds) { // 每次循环创建新实例,避免数据覆盖 FormHasFrequency formHasFrequency = new FormHasFrequency(); formHasFrequency.setFormId(regulatoryform); // 根据ID查询对应的FormFrequency实体 FormFrequency freq = atiServiceImpl.findFormFrequencyById(freqId); formHasFrequency.setFrequencyId(freq); atiServiceImpl.saveFormHasFrequency(formHasFrequency); } } return "redirect:/regulatoryform/"; }
3. 补充说明
- 确保service层已实现
findFormFrequencyById方法,用于根据ID查询FormFrequency实体。 - 若不想修改
RegulatoryForm,也可单独创建表单DTO类来承载复选框选中的ID列表。
内容的提问来源于stack exchange,提问作者Natasha
相关产品推荐
相关产品推荐

