Freemarker 模板 return 字符串而不是 html 元素

Freemarker Template return String instead of html element

我正在使用 Freemarker 模板创建一个表单。 我使用 <#local> 声明了两个变量,它们将保存锚标记和按钮

<#local rightElement = "<a class='set-right' href='${data.url}'>Forgot your password?</a>">

<#local rightButton = "<input type='button' class='js-show-pass btn-toggle-password btn-link' value='Show'>">

我已经使用这个变量传递给创建我的表单结构的宏。但是当我加载我的页面时,我传递的变量在我的表单页面上打印为字符串。我在我的宏中以 ${rightElement}${rightButton} 的形式访问它们。但它正在用双引号打印我的锚标记,使其成为字符串。

我尝试了多种方法来消除双引号,但都没有成功。您能否建议在变量中声明锚标记并将其用作 html 元素而不是 String.

的方法

我不确定你所说的 "printing my anchor tag with double quotes, making it as string" 是什么意思,但我的猜测是你打印的 HTML 得到 auto-escaped,所以你确实看到了 HTML 来源(带有 <-s 和所有)在浏览器中,而不是 link 或按钮。

因此,首先,使用 <#local someName>content</#local> 语法分配值,而不是 <#local someName="content">:

<#local rightElement><a class='set-right' href='${data.url}'>Forgot your password?</a></#local>

<#local rightButton><input type='button' class='js-show-pass btn-toggle-password btn-link' value='Show'></#local>

这确保 ${data.url} 等被正确转义(假设您确实使用 auto-escaping,并且您应该这样做),那么您也不必 avoid/escape "' 在字符串文字中,您可以使用 #if 等构造值等

然后,如果您使用的是 auto-escaping 的现代版本,那么在打印 HTML 值的地方(尝试 ${.output_format} 看看 - 它应该打印 HTML 然后,而不是 undefined),您现在可以只写 ${rightElement},因为 FreeMarker 知道它已被捕获 HTML,因此不需要再转义。如果您使用的是 auto-escaping 的旧版本(使用 #escape 指令),那么您必须编写 <#noescape>${rightElement}</#noescape>.