我的问题类似于以下帖子 Render a view of another controller
我有一个TestConfigController,我的问题是如果验证失败并且我想渲染控制器我可以做什么:测试和查看:编辑而不是控制器:testCOnfig和view:edit
def save() {
def testConfigInstance = new TestConfig(params)
if (!testConfigInstance.save(flush: true)) {
/ *而不是查看:“编辑”我想查看:“/ 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)
}
任何指针?我已经查看过没有“model”参数的grails redirect,因此无法将验证错误传递给视图 此外,我已查看grails render没有控制器参数,以便我可以回到不同的控制器! 如果需要更多细节/代码,请告诉我
修改 使用两件事之一时会发生以下情况
render(view:"/test/edit", model: [testConfigInstance: testConfigInstance],id:params['test.id'])
上面的代码呈现页面/ test / edit而没有引用testid最终错误地说“test.id”不能为null ..(表示它的渲染/测试/编辑而不是/ 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不能为null。
答案 0 :(得分:7)
您尝试在视图路径中追加的id值应该是模型映射的一部分。您在模型映射中提供的值在呈现的视图中可用。
在您尝试的第一个选项中,id参数没有任何区别,因为render方法不使用任何'id'参数(重定向方法使用id参数来生成重定向url)。
您的代码段应该是这样的:
render(view:"/test/edit", model: [testConfigInstance: testConfigInstance, id:params['test.id']])
您在此处使用的渲染方法不会将您重定向到其他某个操作。 render只是将解析后的viewName打印到输出流。例如。 render(view:“/ test / edit”)只是呈现edit.gsp视图。它实际上并没有将您重定向到测试控制器的编辑操作。因此,只是在模型映射中传递id将不允许您访问视图上的testInstance。您必须获取testInstance By id并将其传递给模型映射中的视图
render(view:"/test/edit", model: [testConfigInstance: testConfigInstance, testInstance: Test.get(params['test.id'] as Long)])
答案 1 :(得分:5)
Anuj Arora是对的:
如果您只想渲染任意视图,可以使用与grails-app / view文件夹相关的视图的完整路径:
在你的情况下:
render(view:"/test/edit", model: [testConfigInstance: testConfigInstance],id:params.test.id)
应该有用。
答案 2 :(得分:1)
如果您只想呈现视图/test/edit
,则应该只需要调用render(view:'/test/edit',...)
。
如果您想要包含TestController
和edit
操作中的部分处理,请查看chain()
来电。它有一个model
参数,您可以在其中传递验证错误和controller/action
参数以重定向到另一个控制器。