【问题标题】:Call Grails Controller method without having a view for it在没有视图的情况下调用 Grails Controller 方法
【发布时间】:2016-06-20 13:29:35
【问题描述】:

我正在使用 Grails 3,并且正在制作一个模板页面,其中包含网站其余部分的大纲。我正在尝试按照the official documentation 的建议使用以下代码从控制器调用方法:

<g:include controller="layouts" action="loadUsers" />

我的控制器如下所示:

class LayoutsController {

    def loadUsers() {
        println("we are in here")
    }    

}

当在我的嵌入式 tomcat 上执行包含语句时,我收到以下错误:

[http-nio-8443-exec-4] ERROR o.a.c.c.C.[.[.[.[grailsDispatcherServlet] - Servlet.service() for servlet grailsDispatcherServlet threw exception
javax.servlet.ServletException: Could not resolve view with name 'loadUsers' in servlet with name 'grailsDispatcherServlet'

当然,这个错误是有道理的,因为我没有那个 view/gsp 页面。我只想简单地调用一个方法来在后端创建一些东西,而不是将其绑定到 gsp 页面。这可能吗?基本上,这是一种类似于 JSF 的方法,我可以在 bean 上执行公共方法。

【问题讨论】:

  • 你在寻找类似def loadUsers(){ render 'ok' }的东西吗?

标签: grails


【解决方案1】:

当调用控制器操作时,除非该操作调用类似redirectrender 的内容,否则将呈现视图。这是设计使然,控制器动作应该如何表现。如果视图不存在,则会发生错误。

目前尚不清楚您要做什么,但如果您只是尝试调用一些逻辑,并且您不希望从 GSP 中获得一个有点不寻常的视图,但是您可以通过调用自定义 GSP 标签来完成您想要完成的任何事情。通常所有这些事情都是在视图呈现之前完成的(因此,在涉及任何 GSP 代码之前)。

【讨论】:

  • 感谢您的评论杰夫。虽然我理解你在说什么,但我对如何在 gsp 和服​​务器端方法之间建立桥梁感到困惑。以菜单项的动态显示为例。对我来说,在网站的模板中做一些 语句来识别菜单中的哪些项目应该出现,哪些不应该出现是有意义的。现在不是将它绑定到每个视图/控制器,而是告诉模板调用一些方法来找出哪些项目应该显示或不显示。你能扩展这个例子来解释什么是正确的方法吗?
  • 我认为您可以使用您的布局来完成所有这些工作,如果需要,您可以为不同的部分设置不同的布局。然后,这些模板可以执行您所谈论的逻辑 - 它仍将共享主页变量。未能将您在标签库中寻找的逻辑包装并在需要时调用此标签库。我会推荐第一种方法,因为它的工作量最少@angryip
  • @angryip 通常,您会在视图呈现之前完成大部分条件性工作,然后将所有必要的数据放入将在视图中可用的模型中。在某些情况下,将其中一些延迟到视图呈现时间是有意义的,并且对于其中许多情况,自定义 GSP 标记将是合适的。例如,您可能有一个名为&lt;foo:renderMenu/&gt; 的标签,而renderMenu 标签可以做任何事情来检索必要的数据。
  • @JeffScottBrown 你们都提出了很好的观点。我会试试看,看看我能走多远。谢谢。
猜你喜欢
  • 2018-05-14
  • 2015-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多