Spring Boot Thymeleaf多表单渲染与单对象提交问题求助
问题分析
当前提交表单时SimpleFormData.editedSyncedField为空,核心原因是请求参数的命名未匹配Spring MVC的属性绑定规则:表单输入框的name直接使用了id和jiraField.id,但Spring MVC需要将参数绑定到SimpleFormData的editedSyncedField属性下,因此参数名必须带上editedSyncedField.前缀。
解决方案
修改Thymeleaf模板的表单输入框name属性,同时简化取值逻辑(直接使用循环中的syncedField对象,无需通过列表索引):
<body> <div th:each="syncedField : ${simpleFormData.syncedFields}"> <form th:action="@{/simpleedit}" method="post"> <pre th:text="'syncedField id = ' + ${syncedField.id}"></pre> <pre th:text="'jiraField id = ' + ${syncedField.jiraField.id}"></pre> <!-- 绑定到SimpleFormData.editedSyncedField.id --> <input th:value="${syncedField.id}" th:name="editedSyncedField.id" th:id="editedSyncedField-id-${syncedField.id}" > <!-- 绑定到SimpleFormData.editedSyncedField.jiraField.id --> <input th:value="${syncedField.jiraField.id}" th:name="editedSyncedField.jiraField.id" th:id="editedSyncedField-jiraField-id-${syncedField.id}" > <input type="submit" value="Edit"/> <input type="reset" value="Reset"> </form> </div> </body>
关键说明
- 参数命名规则:Spring MVC通过参数名匹配对象属性,要绑定
SimpleFormData.editedSyncedField.id,参数名必须是editedSyncedField.id,嵌套属性用.分隔。 - 移除冗余的th:object:每个表单提交的是单个对象到
editedSyncedField,直接通过name属性指定绑定路径更清晰,无需绑定到${simpleFormData.editedSyncedField}(渲染时该对象为同一个空实例,无法区分不同表单的目标数据)。 - 唯一ID优化:给每个输入框设置唯一
id(例如追加syncedField.id后缀),避免多个表单的输入框ID重复,符合HTML规范。
验证
提交表单后查看控制器日志receivedFormData,此时simpleFormData.editedSyncedField应包含对应表单的id和jiraField.id值。
内容的提问来源于stack exchange,提问作者Ignat
相关产品推荐
相关产品推荐

