使用变量在th:include中构建片段名称 - ThymeLeaf + Spring Boot

时间:2016-04-06 14:22:53

标签: spring-boot thymeleaf

我想在没有fragment的情况下使用th:fragment功能(仅使用id)。在我的代码中,要包含的目标片段是从迭代器动态构建的。问题是为th:include创建正确表达式以正确呈现。我按照教程尝试了连接,预处理和文字替换,但没有结果 - 让我想到 - 这是th:include允许的吗?

片段定义(它位于我的模板下名为Comments.html的文件中,带有我的其他模板。)

<div id="LOW_SCORE_COMMENT">

它被这样称呼

<div class="well" th:each="commentFragment : ${allComments}">
    <div th:include="'Comments :: #' + {__${commentFragment}__}">
    </div>          
</div>

allCommentsIterator<String>,检索到的字符串是片段ID,因此它应构建整个页面。 但是我得到了这个错误

  

org.thymeleaf.exceptions.TemplateInputException: Error resolving template "'Comments", template might not exist or might not be accessible by any of the configured Template Resolvers

注意&#34;之间的单引号和错误消息中的注释。

你有什么建议吗?

编辑: 我试过这段代码

<div class="well" th:each="commentFragment,iterstat : ${allComments}"> <div th:include="${commentFragment.getValue()}"></div>

基本上将allcomments更改为TreeMap以解决排序问题,但现在错误如下:

  

org.thymeleaf.exceptions.TemplateInputException:解析模板时出错   &#34;评论::#LOW_SCORE_COMMENT&#34;,模板可能不存在或者可能无法由任何已配置的模板解析器访问

2 个答案:

答案 0 :(得分:2)

问题在于缺少预处理符号__ - 请参阅Thymeleaf documentation。没有__的表达式只是按原样替换并传递给生成的HTML页面。

  

预处理是执行在正常表达式之前完成的表达式,允许修改最终将被执行的表达式。

     

预处理表达式与普通表达式完全相同,但显示为双下划线符号(如__${expression}__)。

正确的工作代码是:

<div class="well" th:each="commentFragment : ${allComments}">
    <div th:include="__${commentFragment.getValue()}__"></div>

答案 1 :(得分:0)

这应该使用片段表达式来工作,如here

所述
<div class="well" th:each="commentFragment : ${allComments}">
  <div th:include="~{Comments :: #__${commentFragment}__}">
  </div>          
 </div>