我的问题与下面的帖子类似呈现另一个控制器的视图
我有一个TestConfigController,我的问题是,如果验证失败,我想呈现controller:test and view:edit而不是controller:testCOnfig and 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重定向,它没有"model"参数,因此无法将验证错误传递给视图此外,我还查看了没有控制器参数的grails渲染,这样我就可以回到不同的控制器!请让我知道是否需要更多的细节/代码
编辑在使用的两件事中的一件时发生以下情况
render(view:"/test/edit", model: [testConfigInstance: testConfigInstance],id:params['test.id'])
上面的代码在没有引用testid的情况下呈现页面/test/edit,最终错误地指出"test.id"不能为null。。(指其呈现/测试/编辑,而非测试/编辑/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不能为null。
您试图附加在视图路径中的id值应该是模型映射的一部分。在模型贴图中提供的值在渲染的视图中可用。
在您尝试的第一个选项中,id参数没有任何区别,因为render方法不使用任何"id"参数(重定向方法使用id参数来生成重定向url)。
您的代码片段应该是这样的:
render(view:"/test/edit", model: [testConfigInstance: testConfigInstance, id:params['test.id']])
您在这里使用的渲染方法不会将您重定向到其他操作。render只是将解析后的viewName打印到输出流中。例如,render(视图:"/test/edit")只是渲染edit.gsp视图。它实际上并没有将您重定向到测试控制器的编辑操作。因此,仅仅传递模型映射中的id并不能让您访问视图上的testInstance。您必须获取testInstance By id并将其传递到模型映射中的视图
render(view:"/test/edit", model: [testConfigInstance: testConfigInstance, testInstance: Test.get(params['test.id'] as Long)])
Anuj Arora是对的:
如果你只想渲染一个任意视图,你可以使用grails app/view文件夹相关视图的完整路径:
在您的情况下:
render(view:"/test/edit", model: [testConfigInstance: testConfigInstance],id:params.test.id)
应该起作用。
如果您只想渲染视图/test/edit
,那么调用render(view:'/test/edit',...)
应该就是您所需要的。
如果您还想包含TestController
和edit
操作的一些处理,那么请查看chain()
调用。它有一个model
参数,您可以在其中传递验证错误和controller/action
参数以重定向到另一个控制器。