6

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

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

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

  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 中没有发生。

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

编辑:

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

这是一个屏幕截图: 在此处输入图像描述

4

3 回答 3

0

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

<g:if test="${params.getBoolean("progress")}">
   this should not be displayed
</g:if>
于 2019-01-11T20:49:05.453 回答
0

您可以按如下方式进行测试

<g:if test="${params.progress && params.progress == 'false'}">
   this should not be displayed
 </g:if>
于 2019-01-13T01:10:53.313 回答
0

我意识到您已经找到了解决此问题的方法,但是让我感到困扰的是您的代码与我的代码不同,因此我决定进一步调查以防其他人遇到此问题。

正如这里的其他人所提到的,params.anything通常会返回一个字符串值。这是因为 params 通常被编码为 URI 参数(如 ?progress=false),而不是自动装箱到任何其他类型。(这是完全合理的;Grails 没有好办法知道它们应该是什么类型。)但是,有可能(有时也是合理的)从控制器渲染您的视图或模板,例如render view: whatever, model: [your: model, params: params]您在模型。(也许您有很多不需要在模型中单独重新创建的参数。)在这种情况下,params 映射将作为 URI 参数 (?progress=false) 和页面范围的模型条目 (params: [进度:Boolean.FALSE])。页面范围优先于 URI 参数,因此您的类型将被保留。

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

TL/DR:要么假设参数是字符串,要么在渲染时在页面范围模型中显式包含参数。

于 2019-01-16T17:03:11.530 回答