问题: Controller 的 Action 具有一个render标签,但没有传入模型。存在一个以单词“get”开头的 Action 。

grails-app/views/site/home.gsp:

homepage

SiteController.groovy:
class SiteController {

    def index() {
        render (view: "home")
    }

    def getTest() {
        render "getTest"
    }

}

可通过localhost:8080/site访问该站点,以执行SiteController的索引操作。

预期输出:主页
实际输出:getTest主页

如果将索引的呈现操作更改为:
render(view: "home", model: [:])

产生了预期的输出。

如果在 Action 名称中的单词之前添加了字符,则会产生预期的输出。

有趣的是,在IDEA中,getTest()的颜色编码为紫色。还应注意,如果您有多个以单词get开头的方法,则它们将全部执行。

这在Grails 1.3.6中没有发生。这在一个全新的Grails 2.2.2项目中是可重现的,对我来说似乎是个错误。为什么会这样呢?

最佳答案

GRAILS-9310建议这是一个已知的限制,不会更改,解决方法是不将操作命名为get*。根本原因是



当您定义getTest()方法时,这意味着 Controller 具有test属性,并且当您在没有显式模型的情况下呈现“home” View 时,将枚举 Controller 属性以形成模型图。在此枚举过程中,将调用getTest()方法。

如果确实需要getTest出现在URL中,则必须为实际操作命名,然后定义一个自定义URL映射以将/controller/getTest URI定向到重命名的操作。

关于grails - 在Grails Controller 的 Action 中使用 'get'会导致 Action 即使未调用也会执行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17280800/

10-12 12:43
查看更多