6

问题:控制器的操作有一个渲染标签,但没有传入模型。存在一个以单词“get”开头的动作。

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 主页

如果 index 的渲染动作改成这样:

render(view: "home", model: [:])

产生了预期的输出。

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

有趣的是,getTest() 在 IDEA 中被颜色编码为紫色。还要注意的是,如果你有多个以get开头的方法,它们都会被执行。

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

4

1 回答 1

8

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

如果没有返回显式模型,则控制器的属性将用作模型(Grails 文档

当您定义一个getTest()方法时,这意味着控制器具有一个test属性,并且当您在没有显式模型的情况下呈现“主”视图时,控制器属性将被枚举以形成模型映射。该getTest()方法将作为此枚举过程的一部分被调用。

如果您确实需要getTest出现在 URL 中,那么您必须将实际操作命名为其他名称,然后定义自定义 URL 映射以将/controller/getTestURI 指向重命名的操作。

于 2013-06-24T17:08:22.560 回答