如何在Grails中正确连接两个消息属性?

时间:2019-04-11 17:13:39

标签: grails

一个输入字段上的相同消息属性(编码为HTML)正确呈现,而它(也编码为HTML)在另一个输入域中显示HTML标记。这些发生在GSP视图中。

我想连接消息属性,以避免违反DRY原理。

输入1

<input type="text" class="freeform search-input" title="${g.message(code:"registration.classSearch.field.courseNumberLevels.placeholder.tooltip", encodeAs: "HTML")}">

输入2 我看到问题所在的是三元运算符的false分支。我没有删除三元组,以防万一这可能是问题的一部分。

<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&amp;ndash;4999<br><br><b>Graduate Level</b>:</br>5000+">

使用encodeAs输入2 的输出:

<input title="These special characters are ignored: *^&amp;#39;!@$#&amp;amp;?[ ] ( ) |. The % is allowed.&amp;lt;b&amp;gt;Undergraduate Level&amp;lt;/b&amp;gt;:&amp;lt;br&amp;gt;0&amp;amp;ndash;4999&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;b&amp;gt;Graduate Level&amp;lt;/b&amp;gt;:&amp;lt;/br&amp;gt;5000+" type="text" class="freeform search-input">

不带encodeAs输入2 的输出:

<input title="These special characters are ignored: *^&amp;#39;!@$#&amp;amp;?[ ] ( ) |. The % is allowed.<b>Undergraduate Level</b>:<br>0&amp;ndash;4999<br><br><b>Graduate Level</b>:</br>5000+" type="text" class="freeform search-input">

我希望它在连接和不连接的情况下表现相同,但事实并非如此。我们不应该以这种方式连接吗?

更新 SO thread about HTML tags in message.properties讨论了防止XSS的HTML编码,这使我意识到encodeA正在执行应做的工作-将消息编码为HTML。删除encodeAs允许HTML呈现而不是被编码为HTML实体。

但这仍然不能解释为什么输入2具有HTML实体时呈现输入1的HTML。

3 个答案:

答案 0 :(得分:0)

以连接两个消息属性

该问题可以简化为html中用两个字符串组成的问题。

title = "${g.message(code:'1')}<br><br/>${g.message(code:'2')}"

答案 1 :(得分:0)

因此,如果不是单引号的话...请注意,Stackoverflow甚至无法将输入2识别为HTML ...这是因为您在行尾缺少“>”

答案 2 :(得分:0)

SO thread about HTML tags in message.properties讨论了防止XSS的HTML编码,这使我意识到encodeAs正在执行应做的工作-将消息编码为HTML。删除encodeAs允许HTML呈现而不是被编码为HTML实体。

因此,有两种可能的解决方法,因为我仍然不知道为什么encodeA似乎表现出不同:

  1. 将HTML留在message.properties中,并从encodeAs: "HTML"方法中删除g.message
  2. 将原始消息分成多个部分,然后将HTML移至GSP