不同控制器的Grails渲染视图

不同控制器的Grails渲染视图,grails,redirect,controller,render,gsp,Grails,Redirect,Controller,Render,Gsp,我的问题与下面的帖子类似 我有一个TestConfigController我的问题是,如果验证失败,我想呈现controller:test和view:edit,而不是controller:testCOnfig和view:edit,我该怎么办 def save() { def testConfigInstance = new TestConfig(params) if (!testConfigInstance.save(flush: true)) { /*而不

我的问题与下面的帖子类似

我有一个TestConfigController我的问题是,如果验证失败,我想呈现controller:test和view:edit,而不是controller:testCOnfig和view:edit,我该怎么办

def save() {

        def testConfigInstance = new TestConfig(params)
        if (!testConfigInstance.save(flush: true)) {
/*而不是查看:“编辑”我想要查看:“/test/edit”不起作用*/

有什么建议吗?我已经研究了哪些没有“model”参数,因此无法将验证错误传递给视图 我还查看了没有控制器参数的控制器,以便我可以返回到不同的控制器! 如果需要更多细节/代码,请告诉我

编辑 使用以下两种方法之一时会发生以下情况

render(view:"/test/edit",  model: [testConfigInstance: testConfigInstance],id:params['test.id'])
上面的代码呈现了页面/test/edit,没有引用testid,最后错误地指出“test.id”不能为null。。(指其呈现/测试/编辑和非测试/编辑/1)

上面的代码导致以下错误

The requested resource (/EasyTha/WEB-INF/grails-app/views/test/edit/1.jsp) is not available.
上述任一代码在结尾处仅呈现“/test/edit”无id,因此最终错误地指出test.id不能为null。

Anuj Arora是正确的:

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

就你而言:

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

应该可以工作。

如果您只想呈现视图
/test/edit
,那么调用
render(视图:'/test/edit',…)
就可以了


相反,如果您还希望包含来自
TestController
edit
操作的一些处理,那么请查看调用。它有一个
model
参数,您可以在其中传递验证错误和
controller/action
参数以重定向到另一个控制器。

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

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

您的代码段应该如下所示:

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

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

视图为“/test/edit”的渲染闭包应正常工作。您使用的是哪个版本的grails?能否提供有关“不工作”的更多信息?你收到错误信息了吗?它应该可以工作。@AnujArora Grails 2.0。它现在正在工作,但现在想到它,我有一种感觉,它可能不工作,因为开发环境?也许我应该试试/上下文/测试/edit@Grrrrr您不需要在视图名称上预先添加上下文。Grails应该处理这个问题。@AnujArora很抱歉长期缺席,请参阅我的编辑
chain()
调用的缺点是重定向被发送到客户端。这增加了应用程序的开销。在这种情况下,我更喜欢调用。True,您可以呈现
g.include()
调用的结果,并保存重定向开销。从来没有考虑过这个选项。Hey chain工作得很好,仍然想知道在这样一个场景中如何包括工作,其中test有许多testconfig,我在test/edit/中显示所有testconfig。由于它是一个标记库,打算在GSP中使用(用于呈现模板,而不是
),但您可以在控制器中调用它们,因此,您可以尝试执行类似于
呈现(g.include(controller:'test',action:'edit',model:…)
的操作。此解决方案似乎不适用于只进行测试/编辑而不引用Id的网页呈现。。。我的直觉是,这是因为当我们重定向到test/edit时,模型有testConfig实例?id应该作为模型参数在/test/edit视图中可用。你能把你的gsp贴在这里吗?gsp太大了,不能贴在这里。如果你不介意的话,可以下载吗@请看我的编辑。我认为您正在混淆重定向和渲染。这篇文章可能会帮你很多,谢谢,这很有效。我知道render在java中相当于forward,而redirect则是redirect:)无论如何,非常感谢您的帮助,我从来没有想到我可以在一个模型中发送两个对象。
render(view:"/test/edit",  model: [testConfigInstance: testConfigInstance, id:params['test.id']])
render(view:"/test/edit",  model: [testConfigInstance: testConfigInstance, testInstance: Test.get(params['test.id'] as Long)])