【问题标题】:Rendering view, but no object in gsp渲染视图,但 gsp 中没有对象
【发布时间】:2019-07-06 07:11:30
【问题描述】:

我尝试渲染一个视图,效果很好,但它似乎没有得到我传递给它的模型对象。我无法弄清楚原因,因为根据所有手册和示例,这应该非常简单。

模型对象

class Race {

    def distance = "1/4 mile"
    def racer1
    def racer2
}

RaceController 在此处呈现

def doFullRace(Race race) {

            render (view: 'raceProgress', model: [race: race])
        }

raceProgress.gsp 应该很容易显示它

    <html>
    <body>
        <div id="raceStart" align="center">
...
            <p>${race.racer1} is racing ${race.distance} against ${race.racer2}</p>
        </div>
    </body>
    </html>

但我反而得到了这个

关于我错过了什么基本的东西有什么想法吗?

【问题讨论】:

  • racer1 是空对象,不确定为什么您的类将对象定义为 def - 如果添加 &lt;p&gt;${race?.racer1} is racing ${race?.distance} against ${race?.racer2}&lt;/p&gt;,空点异常将消失,但您仍然没有数据

标签: grails render gsp


【解决方案1】:

你有以下:

def doFullRace(Race race) {
    render (view: 'raceProgress', model: [race: race])
}

race 成为null 的一种方式是,如果以下所有条件都为真:

  • Race 是域类
  • 提交给doFullRace的请求包含一个名为id的请求参数
  • 数据库中没有与id 匹配的记录params.id

来自http://docs.grails.org/3.3.9/guide/theWebLayer.html#commandObjects...

如果命令对象的类型是域类的类型并且存在 id 请求参数,而不是调用域类 创建一个新实例的构造函数将调用静态 域类上的 get 方法和 id 参数的值将 作为参数传递。

还有……

如果命令对象的类型是领域类并且没有id 请求参数或有id请求参数,其值为 空然后 null 将被传递到控制器动作,除非 HTTP 请求方法是“POST”,在这种情况下,一个新的实例 域类将通过调用域类构造函数来创建。 对于域类实例为非空的所有情况,数据 仅当 HTTP 请求方法为“POST”、“PUT”时才执行绑定 或“补丁”。

【讨论】:

  • 这是一个很好的回应!然而,事实证明,事情并没有那么复杂。我两次渲染同一个视图,一次没有模型对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-13
  • 2013-09-15
  • 2014-07-25
  • 2014-12-04
  • 2019-09-04
相关资源
最近更新 更多