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',...)
应该是您所需要的。
如果您还想包含TestController
和edit
操作中的一些处理,请查看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 从视图中调用控制器方法