2014-06-09 62 views
4

經與freemarker的輸出問題...Freemarker的:避免轉義字符的HTML

   [#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> 

但更糟糕:(

+0

你有沒有嘗試在輸出周圍放置noescape? [#noescape] $ {optionsHTML} [/#noescape] – Goose

+0

請注意'[#noescape]'現已被棄用[freemarker.org/docs/ref_directive_escape.html](http://freemarker.org/docs/ref_directive_escape.html )。從Freemaker ** 2.3.24 **開始,在城裏看到新的孩子們:[freemarker.org/docs/dgui_misc_autoescaping.html](http://freemarker.org/docs/dgui_misc_autoescaping.html) –

回答

2

所以想的東西后,我不知道我錯了以前做過,但乾淨,這種方式工作

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



<select> 
    [#noescape] 
    ${optionsHTML} 
    [/#noescape] 
</select> 
2

把周圍#assign#noescape沒有效果。自動轉義僅適用於將直接嵌入到靜態文本(HTML)中的${...}-s。所以在這個#assign裏面禁止轉義。

?html用於「手動」轉義字符串。就像在你的例子中,你可以編寫optionsHTML = optionsHTML + '<option value="${item.value?html}>${item.label?html}</option>',因爲你知道這個值稍後會被輸出爲非自動轉義,並且字符串文字中的${...} -s不會自動轉義。

但是,最好的做法是如果您可以組織代碼,以便生成HTML的內容不會構造HTML內部變量並打印該變量,而是直接將HTML打印到輸出中。這就是FTL的設計目的。

0

像ddekany說,寫的是這樣的:

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

是的,我做過,但是我不得不使用2個列表....可能沒有提及那部分......我爲什麼要構建HTML字符串var的唯一原因是爲了避免在列表中迭代兩次(一次用於輸出選擇選項,另一次時間來獲取標籤,這是通過檢查選定的選項來確定的...我只需要簡化這個例子,以便我可以得到我實際需要的位的答案 –