Grails回报不同的控制器视图

时间:2012-02-07 09:48:53

标签: grails redirect controller render gsp

我的问题类似于以下帖子 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。

3 个答案:

答案 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',...)

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