Grails 渲染不同控制器的视图

Posted

技术标签:

【中文标题】Grails 渲染不同控制器的视图【英文标题】:Grails render view of different controller 【发布时间】:2012-02-28 18:01:59 【问题描述】:

我的问题与以下帖子类似 Render a view of another controller

我有一个 TestConfigController 我的问题是如果验证失败并且我想渲染 controller:test 和 view:edit 而不是 controller:testCONfig 和 view:edit 该怎么办

def save() 

        def testConfigInstance = new TestConfig(params)
        if (!testConfigInstance.save(flush: true)) 

/*而不是查看:“edit”我想要查看:“/test/edit”这不起作用*/

            render(view:"edit",  model: [testConfigInstance: testConfigInstance],id:params.test.id)
            return
        
        println "+++++++++++++++++++++++++"
        flash.message = message(code: 'Data successfully saved', args: [message(code: 'testConfig.label', default: 'Successfully saved')])
        redirect(action: "edit", controller:"test", id:params.test.id)
    

任何指针?我已经查看了没有“模型”参数的grails redirect,因此无法将验证错误传递给视图 我还查看了没有控制器参数的grails render,以便我可以回到不同的控制器! 如果需要更多详细信息/代码,请告诉我

编辑 使用两件事之一时会发生以下情况

render(view:"/test/edit",  model: [testConfigInstance: testConfigInstance],id:params['test.id'])

上面的代码呈现页面 /test/edit 没有参考 testid 最终错误地说“test.id”不能为空..(意味着它的呈现 /test/edit 而不是 /test/edit/1)

render(view:"/test/edit/"+params['test.id'],  model: [testConfigInstance: testConfigInstance],id:params['test.id'])

上面的代码导致以下错误

The requested resource (/EasyTha/WEB-INF/grails-app/views/test/edit/1.jsp) is not available.

上述任一代码最后只呈现“/test/edit”无 id,因此最终会报错说 test.id 不能为空。

【问题讨论】:

带有视图“/test/edit”的渲染闭包应该可以工作。您使用的是哪个版本的 grails? 您能否提供有关“不起作用”的更多信息?你收到一些错误信息吗?它应该可以工作。 @AnujArora Grails 2.0。它现在正在工作,但现在想到它我有一种感觉,由于开发环境,它可能无法正常工作?也许我应该尝试 /context/test/edit @Grrrrrr 您不需要在视图名称前添加上下文。 Grails 应该可以处理这个问题。 @AnujArora 久违了,请看我的编辑 【参考方案1】:

您尝试在视图路径中附加的 id 值应该是模型映射的一部分。您在模型映射中提供的值在呈现的视图中可用。

在您尝试的第一个选项中,id 参数没有任何区别,因为 render 方法不使用任何 'id' 参数(重定向方法使用 id 参数生成重定向 url)。

你的代码 sn-p 应该是这样的:

render(view:"/test/edit",  model: [testConfigInstance: testConfigInstance, id:params['test.id']])

您在此处使用的渲染方法不会将您重定向到其他操作。 render 只是将解析后的 viewName 打印到输出流。例如。 render(view:"/test/edit") 只渲染 edit.gsp 视图。它实际上并没有将您重定向到测试控制器的编辑操作。因此,仅在模型映射中传递 id 不会让您访问视图上的 testInstance。您必须通过 id 获取 testInstance 并将其传递给模型映射中的视图

render(view:"/test/edit",  model: [testConfigInstance: testConfigInstance, testInstance: Test.get(params['test.id'] as Long)])

【讨论】:

此解决方案似乎无法通过仅测试/编辑和没有引用 Id 来处理网页呈现...我的直觉是,这是由于模型具有 testConfig 实例而我们正在重定向到测试/编辑? id 应该在 /test/edit 视图中作为模型参数可用。你能把你的gsp贴在这里吗? GSP 太大,无法粘贴到此处。不介意的话可以下载吗? cynosuredev.com/edit.rar @Grrrrrr 请看我的编辑。我认为您在重定向和渲染之间感到困惑。这篇文章可能会对你有所帮助grails.1312388.n4.nabble.com/… 非常感谢,这行得通。我知道渲染相当于java中的转发,而重定向是重定向:)无论如何,非常感谢您的帮助,我从来没有想过我可以在一个模型中发送两个对象。【参考方案2】:

Anuj Arora 是对的:

如果您只想渲染任意视图,可以使用与 grails-app/view 文件夹相关的视图的完整路径:

在你的情况下:

render(view:"/test/edit",  model: [testConfigInstance: testConfigInstance],id:params.test.id)

应该可以。

【讨论】:

【参考方案3】:

如果您只想渲染视图/test/edit,那么调用render(view:'/test/edit',...) 应该是您所需要的。

如果您还想包含TestControlleredit 操作中的一些处理,请查看chain() 调用。它有一个model 参数,您可以在其中传递验证错误和controller/action 参数以重定向到另一个控制器。

【讨论】:

chain() 调用的缺点是重定向被发送到客户端。这增加了应用程序的开销。在这种情况下,我更喜欢include() 电话。 没错,您可以渲染g.include() 调用的结果并节省重定向开销。从来没有考虑过这个选项。 嘿链工作得很好,仍然想知道在测试有很多 testconfig 并且我在 test/edit/.. 中显示所有 testconfig 的情况下如何包含工作。 因为它是一个标签库,它旨在用于 GSP(用于渲染模板而不是 <g:render/>),但您可以在控制器中调用它们,因此您可以尝试执行类似的操作render(g.include(controller:'test',action:'edit',model:...)).

以上是关于Grails 渲染不同控制器的视图的主要内容,如果未能解决你的问题,请参考以下文章

Groovy/grails 如何使用 jquery 从视图中调用控制器方法

Grails控制器渲染方法render vs respond

如何创建不同名称的控制器和视图 Grails 脚手架

Grails 不会将变量传递给嵌套模板

Grails 中的链控制器操作 [关闭]

Grails 在自定义视图中关联来自两个不同域的值