一个输入字段上的相同消息属性(编码为 HTML)正确呈现,而该属性(也编码为 HTML)在另一个输入字段中显示 HTML 标记。这些都出现在普惠制视图中。
我想连接消息属性以避免违反 DRY 原则。
输入 1
<input type="text" class="freeform search-input" title="${g.message(code:"registration.classSearch.field.courseNumberLevels.placeholder.tooltip", encodeAs: "HTML")}">
输入 2三元运算符的错误分支是我看到问题的地方。我没有去掉三元,以防万一它可能是问题的一部分。
<input title="${config.config.contains('keyword')? g.message(code:"registration.classSearch.field.keywordinputbox.placeholder.tooltip", encodeAs: "HTML"):g.message(code:"registration.classSearch.field.inputbox.placeholder.tooltip", encodeAs: "HTML") + "<br><br>" + g.message(code:"registration.classSearch.field.courseNumberLevels.placeholder.tooltip", encodeAs: "HTML")}">
从输入 2 中删除encodeAs: "HTML"
会导致其正确显示。
<input title="${config.config.contains('keyword')? g.message(code:"registration.classSearch.field.keywordinputbox.placeholder.tooltip", encodeAs: "HTML"):g.message(code:"registration.classSearch.field.inputbox.placeholder.tooltip", encodeAs: "HTML") + "<br><br>" + g.message(code:"registration.classSearch.field.courseNumberLevels.placeholder.tooltip")}"
删除这两个<br><br>
不会按预期产生任何效果。将第一个g.message
更改为纯文本消息属性也不起作用。
输入 1的输出:
<input type="text" class="freeform search-input" title="<b>Undergraduate Level</b>:<br>0&ndash;4999<br><br><b>Graduate Level</b>:</br>5000+">
带encodeAs
的输入 2的输出:
<input title="These special characters are ignored: *^&#39;!@$#&amp;?[ ] ( ) |. The % is allowed.&lt;b&gt;Undergraduate Level&lt;/b&gt;:&lt;br&gt;0&amp;ndash;4999&lt;br&gt;&lt;br&gt;&lt;b&gt;Graduate Level&lt;/b&gt;:&lt;/br&gt;5000+" type="text" class="freeform search-input">
不带encodeAs
的输入 2的输出:
<input title="These special characters are ignored: *^&#39;!@$#&amp;?[ ] ( ) |. The % is allowed.<b>Undergraduate Level</b>:<br>0&ndash;4999<br><br><b>Graduate Level</b>:</br>5000+" type="text" class="freeform search-input">
我希望它在有和没有连接的情况下表现相同,但它没有。我们不应该以这种方式连接吗?
更新这个关于 message.properties 中 HTML 标签的 SO 线程讨论了防止 XSS 的 HTML 编码,这让我意识到 encodeAs 正在做它应该做的事情——将消息编码为 HTML。删除编码允许 HTML 呈现,而不是编码为 HTML 实体。
但这仍然不能解释为什么输入 1 的 HTML 被呈现,而输入 2 具有 HTML 实体。
连接两个消息属性
这个Probleam可以简化为Probleam在HTML中组合两个字符串。
title = "${g.message(code:'1')}<br><br/>${g.message(code:'2')}"
所以如果不是单引号的东西......请注意,Stackoverflow 甚至无法将您的输入 2 识别为 HTML...这是因为您错过了行末尾的关闭">"。
这个关于 message.properties 中的 HTML 标签的 SO 线程讨论了防止 XSS 的 HTML 编码,这让我意识到 encodeAs 正在做它应该做的事情——将消息编码为 HTML。删除编码允许 HTML 呈现,而不是编码为 HTML 实体。
因此,有两种可能的解决方法,因为我仍然不知道为什么 encodeAs 的行为似乎有所不同:
- 将 HTML 保留在
message.properties
中,并从g.message
方法中删除encodeAs: "HTML"
- 将原始邮件分成不同的部分,并将 HTML 移至 GSP