我几个小时以来一直在努力解决这些问题,并得出结论可能是2.0.0.RC1的错误。
起初我以为这是我正在进行的项目,但后来我创建了一个完整的新项目,并且能够重新创建错误。我使用的是grails 2.0.0.RC1。
当我尝试在GSP中包含模型对象时,错误就出现了,例如:
<p>This data is coming from the model:</p>
<p>content: ${content}</p>
<g:include model="${otherModel}" view="/hello/include.gsp" />
现在在我的行动中我有类似的东西:
package helloworld
class HelloController {
def index() {
def model = [:]
model.content = 'content...'
def includeModel = [:]
includeModel.content = 'includeModel...'
model.otherModel = includeModel
render( view:'index', model:model )
}
}
/hello/include.gsp文件包含以下内容:
<p>This data is coming from the included model:</p>
<p>content: ${content}</p>
但是,页面上显示的内容并不是我所期待的,这就是页面上显示的内容:
This data is coming from the model:
content: content...
This data is coming from the included model:
content: content...
有什么想法吗?非常感谢任何帮助。
谢谢, -Cesar
答案 0 :(得分:2)
这可能是一个错误,但根据文档,include标记专门设计为包含当前响应中另一个控制器/操作或视图的响应 - 而不仅仅是其他GSP。如果你想在你的页面中“包含”另一个GSP,你真的应该使用render标签。我已验证您的代码与渲染代码一起正常运行,并将include.gsp
重命名为_include.gsp
并使代码为<g:render model="${otherModel}" template="include" />
。我得到了以下输出:
此数据来自模型:
内容:内容......
使用g:render: 这些数据来自所包含的模型:
内容:includeModel ...
我还尝试向控制器添加另一个操作以返回包含的内容并渲染include.gsp,然后使用g:include标记在页面中输出它并且它有效:
def include() {
def includeModel = [:]
includeModel.content = 'includeModel...'
includeModel
}
然后在index.gsp中我添加了:
<g:include action="include"/>
我得到了:
此数据来自模型:
内容:内容......
使用g:render: 这些数据来自所包含的模型:
内容:includeModel ...
使用g:include with action 这些数据来自所包含的模型:
内容:includeModel ...
此外,如果视图与控制器中的方法同名,则不必在控制器中指定render(view:'viewname,...)。您只需返回模型,Grails将自动选择与控制器操作同名的GSP文件。
所有这一切,仍然看起来你正在尝试使用include标签应该工作,我无法解释为什么它不是(并且标签的源代码没有显示在文档的底部,如它应该是)。如果渲染标签不是您的选择,我建议您提交JIRA。