FREEMARKER: избегайте экранирования символов HTML

Возникла проблема с выводом freemarker...

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

so, if I do

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

но еще хуже :(


person DS_web_developer    schedule 09.06.2014    source источник
comment
Вы пытались поставить noescape вокруг вывода? [#noescape]${optionsHTML}[/#noescape]   -  person Goose    schedule 10.06.2014
comment
Обратите внимание, что [#noescape] больше не рекомендуется использовать freemarker.org/docs/ref_directive_escape.html. Посмотрите на новых детей в городе после Freemaker 2.3.24: freemarker.org/docs /dgui_misc_autoescaping.html   -  person Adrien Be    schedule 24.11.2016


Ответы (4)


Помещение #noescape рядом с #assign не дает никакого эффекта. Автоматическое экранирование применяется только к ${...}, которые встроены напрямую в статический текст (HTML). Так что внутри этого #assign нет выхода для отключения.

?html используется для экранирования строки "вручную". Как и в вашем примере, вы можете написать optionsHTML = optionsHTML + '<option value="${item.value?html}>${item.label?html}</option>', потому что вы знаете, что значение будет выведено без автоматического экранирования позже, а ${...} внутри строкового литерала не экранируются автоматически.

Однако было бы лучше, если бы вы могли организовать свой код так, чтобы вещи, генерирующие HTML, не создавали HTML внутри переменных, а затем печатали переменную, а печатали HTML непосредственно в вывод. Это то, для чего предназначен FTL.

person ddekany    schedule 10.06.2014

Итак, после того, как я попробовал что-то, я не знаю, что я сделал не так раньше, но чистый, этот способ работает

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



<select>
   [#noescape]
   ${optionsHTML}
   [/#noescape]
</select>
person DS_web_developer    schedule 18.06.2014

Как сказал ddekany, напишите что-то вроде этого:

<select>
  [#list data as item]
    <option value="${item.value}">${item.label}</option>
  [/#list]
</select>
person Esko Piirainen    schedule 17.06.2014
comment
да, я это сделал, но затем мне пришлось использовать 2 списка ...., вероятно, не упомянул эту часть ... единственная причина, по которой я делаю это с созданием HTML-строки var, заключается в том, чтобы избежать повторения по списку дважды (один раз для вывода выбранных опций, в другой раз, чтобы получить метку, которая определяется проверкой выбранной опции... Мне просто нужно было упростить этот пример, чтобы я мог получить ответ для того бита, который мне действительно нужен - person DS_web_developer; 18.06.2014

Я столкнулся с той же проблемой в строке со специальными символами. В этом примере у меня есть checknumber = "6547&6548", что вызвало проблему перед использованием этого #escape

лучший и простой способ справиться с этим как следующий код

<#escape x as x?html>${deposit.checkNumber}</#escape>
person Nagesh Dalave    schedule 25.04.2018