g:include的Include布尔参数作为字符串传递给包含的视图

时间:2019-01-08 09:04:50

标签: grails grails-3.3.x

我不知道以下更改是一个问题还是有意进行。

<g:include view="line.gsp" params="['label':'test', 'progress':false]"/>

然后,line.gsp aways中的表达式的计算结果为true,因为“ progress”参数的类型为String,而不是布尔值。

  class is: ${params.progress.getClass()}
  <g:if test="${params.progress}">
   this should not be displayed
 </g:if>

请注意,同样适用于其他类型,而不仅是布尔值。 我正在使用grails 3.3.8 这在grails 2.5.2中没有发生。

我没有在网上找到关于此的任何信息,所以这就是为什么我在这里询问。谢谢。

编辑:

正如丹尼尔(Daniel)建议的那样,我也尝试了grails 3.3.2。 我刚刚使用grails create-app创建了一个应用,并修改了现有的index.gsp使其包含line.gsp,如上面的代码所示。

这是屏幕截图: enter image description here

3 个答案:

答案 0 :(得分:0)

是的,这是真的。当您调用params.something时,实际上是在访问作为地图的GrailsParameterMap。因此,您的条件实际上评估为Map-> get(),它将是Object-> toString(),并且当然是正确的,因为它不是null也不为空。因此解决方案如下:

<g:if test="${params.getBoolean("progress")}">
   this should not be displayed
</g:if>

答案 1 :(得分:0)

您可以如下进行测试

<g:if test="${params.progress && params.progress == 'false'}">
   this should not be displayed
 </g:if>

答案 2 :(得分:0)

我意识到您已经找到了解决此问题的方法,但是令您感到困扰的是,您的代码无法像我的代码那样工作,因此我决定进一步调查,以防其他人遇到此问题。

正如这里的其他人所提到的,with(x, which.min(Col1 != quantile(Col1, .5, type = 1))) 通常将返回String值。这是因为参数通常被编码为URI参数(例如?progress = false),并且不会自动装箱成任何其他类型。 (这是完全合理的; Grails不会知道它们应该是什么类型。)但是,可以(有时是合理的)从params.anything这样的控制器中渲染视图或模板。具体包括模型中的参数。 (也许您有很多参数,不需要在模型中分别重新创建。)在这种情况下,参数映射将作为URI参数(?progress = false)和页面范围的模型条目(参数:[进度:Boolean.FALSE])。页面范围优先于URI参数,因此您的类型将被保留。

在测试中,我将您的代码添加到了已经将参数传递给模型的现有页面上,因此还为新添加的参数保留了类型。 (请注意,一旦参数进入页面范围,它们也将用于包含的模板或视图。)因此,我看到了Boolean的进度类型,而在一个基本示例中,它将是String类型。

TL / DR:要么假定参数是字符串,要么在呈现时在页面范围模型中明确包含参数。