HTMX为何将对象字段作为URL参数?如何改为id参数(Spring Boot+Thymeleaf)
解决方案
1. 调整HTMX请求参数为id
th:field="*{textBlocks}"会让HTMX自动把字段名textBlocks作为请求参数名。要改成id,可以放弃th:field的自动绑定,改用hx-vars明确指定参数:
<select name="textBlockDescription" hx-get="/text-block" hx-vars="id: this.value"> <option th:each="block : ${availableTextBlocks}" th:value="${block.id}" th:text="${block.description}"> </option> </select>
hx-vars="id: this.value"会告诉HTMX,发起请求时携带id参数,值为当前select的选中值,最终生成的URL就是/text-block?id=1。
2. 移除自动生成的_textBlocks隐藏字段
这个隐藏字段是Thymeleaf处理集合/数组类型的th:field时,为维护表单状态自动生成的。只要去掉th:field="*{textBlocks}",改用手动设置name和value(如上代码),Thymeleaf就不会再生成这个多余的隐藏字段。
3. 保留select的name为textBlockDescription
th:field会强制覆盖name属性,因为它的核心作用是绑定表单对象的字段。要保留自定义的name值,有两种方式:
- 直接手动写
name="textBlockDescription",不使用th:field(如上代码); - 如果需要绑定表单对象的
textBlockDescription字段,用th:name替代th:field:
<select th:name="*{textBlockDescription}" hx-get="/text-block" hx-vars="id: this.value"> <option th:each="block : ${availableTextBlocks}" th:value="${block.id}" th:text="${block.description}"> </option> </select>
两种方式都能让select的name保持为textBlockDescription,同时避免th:field带来的副作用。
内容的提问来源于stack exchange,提问作者Roman_Nazarenko
相关产品推荐
相关产品推荐

