grails - 包含带有 g :include are passed as Strings to the included view 的 bool 参数

标签 grails grails-3.3.x

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

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

然后 line.gsp aways 中的表达式计算为 true,因为“progress”参数的类型是字符串,而不是 bool 值。
  class is: ${params.progress.getClass()}
  <g:if test="${params.progress}">
   this should not be displayed
 </g:if>

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

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

编辑:

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

这是一个屏幕截图:
enter image description here

最佳答案

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

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

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

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

关于grails - 包含带有 g :include are passed as Strings to the included view 的 bool 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54088388/

相关文章:

grails - Grails 3.3.6不为命令gradle文档触发DocStart和DocEnd事件

grails - 如何在 grails 3.3.11 中深度克隆域对象?

Grails 3.3.2 Spring Security CAS 不能通过负载均衡器工作,但可以通过部署在其上的内部服务器正常工作

grails - 覆盖插件Impl

performance - Grails 的可扩展性如何?

java - Tomcat 服务器部署连接关闭

Grails:如何从 Controller 或服务访问 i18n?

grails - 读取在屏幕上输入的参数