尽管阅读了文档,但一些用于将数据从 Controller 传递到 View 的Grails约定我还是有些不透明。一些基本问题:
这里有一些问题:
1)在为“Person” Controller 创建的支架中,索引 Action 以
respond Person.list(params) model:[personCount: Person.count()]
在index.gsp中,使用以下命令将列表呈现给浏览器:
<f:table collection="${personList}" />
我的问题是,这个personList变量来自哪里?或者换种说法, Controller 中Person.list(...)的输出如何在名称为personList的 View 中显示?关于您是否致电,是否有一个普遍适用的规则
respond foo
并且foo是一个列表,那么它将以名称“fooList”显示在 Controller 中吗?
2)如果仅通过说“render foo”就可以向 Controller 提供对象,那么model参数的目的是什么?即之间有一些区别
respond foo
和
respond model:[foo: foo]
似乎两者都可以使用
"${foo}"
在 View 中访问3)最后,对“响应”和“渲染”之间的区别的简要描述是什么?它们似乎都将数据从 Controller 传递到 View 。
最佳答案
因此,文档在解释respond和render方面做得很好,并指出了两者之间的区别。特别是您提出的问题。
不过,我还是会在这里回答他们:
respond
时,它将尝试根据类型确定适当的模型变量名称。因此,对于您的示例,由于Person.list()
返回List
,因此模型变量变为personList
,而在您的其他示例中,如果foo
是List
,则它的确变为fooList
。有关respond的文档对此进行了说明(带有特定示例)。 respond
和render
不同,因为respond
尝试根据accept
header (或文件扩展名)以最合适的模型进行回复。其中render
允许您使用更具体的控件来呈现响应,而不管accept
header (或文件扩展名)如何。在文档的两个描述中也清楚了这一点。 respond
和render
的描述中找到(来自文档):和
简而言之:“当您要支持多种类型的响应类型并遵循Grails约定时,请使用
respond
;而当您要对响应类型进行更具体的控制时,请使用render
。