标记g:include未正确地将模型传递给视图

时间:2011-11-06 19:22:51

标签: grails

我几个小时以来一直在努力解决这些问题,并得出结论可能是2.0.0.RC1的错误。

起初我以为这是我正在进行的项目,但后来我创建了一个完整的新项目,并且能够重新创建错误。我使用的是grails 2.0.0.RC1。

当我尝试在GSP中包含模型对象时,错误就出现了,例如:

/hello/index.gsp

 <p>This data is coming from the model:</p>
 <p>content: ${content}</p>
 <g:include model="${otherModel}" view="/hello/include.gsp" />

现在在我的行动中我有类似的东西:

HelloController.groovy

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文件包含以下内容:

/hello/include.gsp

<p>This data is coming from the included model:</p>
<p>content: ${content}</p>

但是,页面上显示的内容并不是我所期待的,这就是页面上显示的内容:

http://localhost:8080/helloworld/hello/index

This data is coming from the model:
content: content...
This data is coming from the included model:
content: content...

有什么想法吗?非常感谢任何帮助。

谢谢, -Cesar

1 个答案:

答案 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。