FREEMARKER:避免转义 HTML 字符

问题描述 投票:0回答:5

freemarker 输出有问题...

                [#assign optionsHTML = ""]                    
                [#list data as item]
                    [#assign optionsHTML = optionsHTML + '<option value="' + item.value +'>'+ item.label + '</option>' /]
                [/#list]

所以,如果我这样做

<select>
${iptionsHTML}
</select>

otions 的输出得到 html 实体而不是实际的 html....所以

&lt;option value=&quot .....

即使我这样做

            [#assign optionsHTML = ""]                    
            [#list data as item]
                [#noescape]
                [#assign optionsHTML = optionsHTML + '<option value="' + item.value +'>'+ item.label + '</option>' /]
                [/#noescape]
            [/#list]

甚至尝试过

<select>
${iptionsHTML?html}
</select>

但更糟糕:(

freemarker html-escape-characters
5个回答
2
投票

#noescape
放在
#assign
周围没有效果。自动转义仅适用于“直接”嵌入到静态文本(HTML)中的“
${...}
-s”。所以无法逃避在其中禁用 #assign

?html

用于“手动”转义字符串。就像在您的示例中一样,您可以编写

optionsHTML = optionsHTML + '<option value="${item.value?html}>${item.label?html}</option>'
,因为您知道该值稍后将被非自动转义输出,并且字符串文字中的
${...}
-s 不会自动转义。

但是,最好的情况是您可以组织代码,以便生成 HTML 的东西不会在变量内构造 HTML,然后打印该变量,而是将 HTML 直接打印到输出中。这就是 FTL 的设计目的。


2
投票

[#assign optionsHTML = ""] [#list data as item] [#assign optionsHTML = optionsHTML + '<option value="' + item.value +'>'+ item.label + '</option>' /] [/#list] <select> [#noescape] ${optionsHTML} [/#noescape] </select>



0
投票

<select> [#list data as item] <option value="${item.value}">${item.label}</option> [/#list] </select>



0
投票

处理此问题的最佳且简单的方法如下代码

<#escape x as x?html>${deposit.checkNumber}</#escape>



0
投票
禁用自动转义

,这导致我使用?no_esc方法,例如:

<#assign url += “${url?contains(‘?’)?then(‘&’, ‘?’)?no_esc}” + “redirect=true” />

顺便说一句,如果有人知道在 Freemarker 中向 url 添加参数的更简单方法(
就像 Thymeleaf

),请评论。

© www.soinside.com 2019 - 2024. All rights reserved.