尽管阅读了文档,但一些用于将数据从 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 。

最佳答案

因此,文档在解释respondrender方面做得很好,并指出了两者之间的区别。特别是您提出的问题。

不过,我还是会在这里回答他们:

  • 使用respond时,它将尝试根据类型确定适当的模型变量名称。因此,对于您的示例,由于Person.list()返回List,因此模型变量变为personList,而在您的其他示例中,如果fooList,则它的确变为fooList。有关respond的文档对此进行了说明(带有特定示例)。
  • respondrender不同,因为respond尝试根据accept header (或文件扩展名)以最合适的模型进行回复。其中render允许您使用更具体的控件来呈现响应,而不管accept header (或文件扩展名)如何。在文档的两个描述中也清楚了这一点。
  • 差异的简洁描述可在respondrender的描述中找到(来自文档):







  • 简而言之:“当您要支持多种类型的响应类型并遵循Grails约定时,请使用respond;而当您要对响应类型进行更具体的控制时,请使用render

    10-07 17:07