Gab*_*abi 6 grails grails-3.3.x
我不知道以下更改是一个问题还是意图.
<g:include view="line.gsp" params="['label':'test', 'progress':false]"/>
Run Code Online (Sandbox Code Playgroud)
然后line.gsp aways中的表达式求值为true,因为'progress'参数的类型是String,而不是Boolean.
class is: ${params.progress.getClass()}
<g:if test="${params.progress}">
this should not be displayed
</g:if>
Run Code Online (Sandbox Code Playgroud)
请注意,这同样适用于其他类型,而不仅仅是布尔值.我正在使用grails 3.3.8这不会发生在grails 2.5.2中.
我没有在网上找到任何关于这个的信息,所以这就是我在这里问的原因.谢谢.
编辑:
正如Daniel所说,我也尝试过grails 3.3.2.我刚刚使用grails create-app创建了一个应用程序,并修改了现有的index.gsp以包含line.gsp,如上面的代码所示.
我意识到您已经找到了解决此问题的方法,但令我困扰的是您的代码与我的代码的工作方式不同,因此我决定进一步调查以防其他人遇到此问题。
正如这里其他人提到的,params.anything通常会返回一个字符串值。这是因为 params 通常被编码为 URI 参数(如 ?progress=false),并且不会自动装箱为任何其他类型。(这是完全合理的;Grails 没有办法知道它们应该是什么类型。)但是,可以(有时是合理的)从控制器渲染视图或模板,就像在控制器中专门包含render view: whatever, model: [your: model, params: params]参数的地方一样。模型。(也许您有很多不需要在模型中单独重新创建的参数。)在这种情况下,参数映射将作为 URI 参数 (?progress=false) 和页面范围的模型条目(参数:[进度:布尔值.FALSE])。页面范围优先于 URI 参数,因此您的类型将被保留。
在我的测试中,我将代码添加到现有页面,在该页面中我已经将参数传递到模型中,因此也为新添加的参数保留了类型。(请注意,一旦参数位于页面范围内,它们也可用于包含的模板或视图。)因此,我看到了 Boolean 的进度类型,而在基本示例中它将是 String 类型。
TL/DR:要么假设参数是字符串,要么在渲染时在页面范围的模型中显式包含参数。