评估GSP标签内的表达

时间:2014-05-15 16:49:50

标签: grails groovy gsp

我正在尝试评估GSP标记中的表达式。粗暴地说,

<g:form ${true ? 'name=\"hello\"' : ''}>

但我得到的错误是:

Class: org.codehaus.groovy.grails.web.taglib.exceptions.GrailsTagException
Message: Attribute value must be quoted (${true ? 'name=\"hello\"' : ''}).

在其他一个视图中,以下表达式(与上面的表达式类似)可以正常工作。

<li ${controllerName == null ? ' class=active' : ''}>

但它不适用于表单标记。我正在使用Grails 2.3.5。知道我做错了吗?

编辑:我也有类似的问题。

<g:form url="[${multiple ? '' : 'resource:xyzInstance, '}action:'update']" method="PUT" >

这里,multiple是一个布尔值。它适用于<g:if>标记。

<g:if test="${multiple}">

2 个答案:

答案 0 :(得分:2)

在Groovy中,双引号不得在单引号字符串中进行转义。 相反的情况也适用:单引号不得在双引号字符串中转义(顺便说一句称为GStrings)

尝试

<g:form ${true ? 'name="hello"' : ''}>

<g:form ${true ? "name=\"hello\"" : ''}>

两者都有效。

对于更新问题的第二部分,我建议单独构建地图,因为它不仅会起作用,而且您的代码将更易于阅读和维护。类似的东西:

<%
def urlMap = [action: 'update']
if(multiple)
urlMap.put 'resource', 'xyzInstance'
%>
<g:form url="${urlMap}" method="PUT">

在使用某些属性作为值的类型时要小心,这有时会给我带来一些麻烦:

  • 'a String'
  • “带有$ {dynamicValue}”的GString
  • “[一个看起来像列表的GString]”
  • “$ {[a,list]}”
  • “$ {[a:map]}”
  • “false”&lt; - 这将始终被评估为true,因为它是非空的非null GString
  • “$ {false}”&lt; - 上述行问题的解决方案

我希望这一切能解决你的问题。为了简单起见,我总是建议保持值表达式尽可能简单,如果它们需要复杂的逻辑,请将它放在标签之前的块中,它将从中受益。

答案 1 :(得分:1)

我想这不是真正的表达方式

<g:form ${true ? 'name=\"hello\"' : ''}>

因为没有必要为此使用表达式,因为它等同于:

<g:form name="hello">

我想你需要的是像

<g:form name="${someVariable ? 'hello' : ''}">

如果这没有帮助,你能否更新你的问题以显示真实的表达?