Thymeleaf+Spring Boot前端无法替换参数化片段值求助
解决Thymeleaf参数化片段传递变量显示字符串而非实际值的问题
嘿,我看出来你遇到的问题了——你的片段调用方式把变量当成字面量字符串传递了,所以页面才显示id而不是预期的3。咱们一步步拆解问题,然后给出修正方案:
问题根源分析
你的两种调用方式都存在变量传递的错误:
- 方式一的错误:
th:with="adminObj='${adminObj}', id='${id}'"里,你用单引号把表达式包裹起来了,这会让Thymeleaf把${adminObj}和${id}当成纯字符串,而不是去解析模型中的变量。所以片段接收的是字符串"${adminObj}"和"${id}",自然显示的是id这个字符串。 - 方式二的错误:你没有明确指定要传递的是模型中的变量,Thymeleaf默认会把参数名当成字面量处理,所以传递的是字符串
id,而不是模型里的id变量值3。
另外,你的index.html里还定义了同名的<div th:fragment="admin_form(adminObj, id)"></div>,这属于多余的定义,会和你要引用的外部片段造成混淆,建议直接删掉这一行。
正确的片段调用方式
下面是两种可行的正确调用方式:
方式1:直接在片段参数中引用模型变量
不需要额外的th:with,直接在片段调用的括号里用${}引用模型变量:
<div th:replace="fragments/adminForm :: admin_form(${adminObj}, ${id})"> <p th:text="${id}"></p> </div>
这里的${adminObj}和${id}会直接解析模型中的对应变量,把值传递给片段的参数。
方式2:用th:with传递变量(正确写法)
如果一定要用th:with,记得不要给表达式加单引号,直接写变量表达式:
<div th:replace="fragments/adminForm :: admin_form(adminObj, id)" th:with="adminObj=${adminObj}, id=${id}"> <p th:text="${id}"></p> </div>
这里的th:with是把模型中的adminObj和id赋值给片段需要的同名参数,没有单引号的情况下,Thymeleaf才会解析表达式获取变量值。
额外的控制器修正建议
你当前的AdminController中,/admin-reload方法返回的是片段本身,如果你是想在index.html页面中加载这个片段,需要添加一个渲染index.html的方法,把变量放到模型里:
@Controller public class AdminController { // 渲染主页面,传递变量 @GetMapping("/index") public String index(Model model) { Admin adminObj = new Admin(3); model.addAttribute("adminObj", adminObj); model.addAttribute("id", adminObj.getId()); return "index"; } // 单独返回片段的方法(如果需要AJAX重载的话) @GetMapping("/admin-reload") public String reloadElementDiv(Model model) { Admin adminObj = new Admin(3); model.addAttribute("adminObj", adminObj); model.addAttribute("id", adminObj.getId()); return "/fragments/adminForm"; } }
这样当你访问/index时,模型中就有了adminObj和id变量,片段就能正确显示3了。
内容的提问来源于stack exchange,提问作者asker
相关产品推荐
相关产品推荐

