Thymeleaf 3中th:attr条件赋值报错,输入框不显示问题求助
嘿,这个错误我之前也踩过坑!问题出在你写的th:attr里的条件表达式语法不符合Thymeleaf的解析规则——它没办法正确识别你那种在条件分支里混着多个属性的写法。
错误原因拆解
你原来的代码试图在同一个条件表达式里同时处理data-msg和name属性,但Thymeleaf的th:attr要求每个属性赋值都是清晰的独立项,而且条件表达式的写法需要更严谨:比如你没给data-msg的赋值加引号,同时分支里重复写name=${genericField.field}的写法也不符合它的解析逻辑,这些都是导致Could not parse as assignation sequence错误的原因。
几种可行的解决方法
方法1:拆分属性,用Thymeleaf专用属性(推荐)
Thymeleaf支持直接用th:data-msg这种驼峰式写法来生成data-msg属性,把固定的name属性单独用th:name处理,条件性的data-msg单独判断:
<input type="text" class="form-control" th:id="'genericForm'+${genericField.field}" th:name="${genericField.field}" th:data-msg="${genericField.mandatory} ? #{mandatory.field} : null"/>
当genericField.mandatory为false时,赋值null会让Thymeleaf自动忽略这个属性,不会渲染到最终HTML里,完美符合你的需求。
方法2:修正th:attr的条件写法
如果你一定要用th:attr来统一处理,需要把条件表达式限定在单个属性上,用字符串拼接的方式生成完整的属性赋值,同时用逗号分隔多个属性项:
<input type="text" class="form-control" th:id="'genericForm'+${genericField.field}" th:attr="name=${genericField.field}, ${genericField.mandatory} ? 'data-msg=' + #{mandatory.field} : ''"/>
这里注意条件部分要把属性名和值拼接成完整的字符串,当条件不满足时赋值空字符串,Thymeleaf就不会渲染这个属性。
方法3:用th:if单独控制条件属性
如果追求极致的可读性,可以用th:if来单独添加data-msg属性,虽然代码稍显冗余,但逻辑非常清晰:
<input type="text" class="form-control" th:id="'genericForm'+${genericField.field}" th:name="${genericField.field}" th:if="${genericField.mandatory}" th:data-msg="#{mandatory.field}"/>
当mandatory为true时才会渲染data-msg属性,和前两种方法效果完全一致。
内容的提问来源于stack exchange,提问作者robert trudel

