【问题标题】:Grails 3.3.1 Controller action with domain object argument - how is data bound?Grails 3.3.1 带有域对象参数的控制器动作 - 数据如何绑定?
【发布时间】:2017-10-02 19:07:48
【问题描述】:

This question 看起来有些相似,但那里的提问者试图了解当域对象是控制器操作参数时一对多数据绑定是如何工作的。

我想了解,当 Domain 类作为参数提供给 Controller 操作时,会调用哪些方法。考虑默认的 update 操作:

def update(MyDomain myDomain) {
    if (myDomain == null) {
        notFound()
        return
    }

    try {
        myDomainService.save(myDomain)
    } catch (ValidationException e) {
        respond myDomain.errors, view:'edit'
        return
    }

    request.withFormat {
        form multipartForm {
            flash.message = message(code: 'default.updated.message', args:
                [message(code: 'myDomain.label', default: 'MyDomain'), myDomain.id])
            redirect myDomain
        }
        '*'{ respond myDomain, [status: OK] }
    }
}

导致上述控制器操作范围的事件顺序是什么?我的最佳猜测如下,但我想确认一下。

def someActionWrapper() {
    MyDomain instance = MyDomain.get(params.id)
    instance.properties = params
    update(instance)
}

认为它必须去数据库获取表单上没有的任何字段,然后用表单上的任何值覆盖,然后调用实际的控制器操作。

编辑

当被问到这个问题时库的当前版本:

  • Grails 3.3.1
  • Groovy 2.4.12

【问题讨论】:

  • “我认为它必须去数据库获取表单上没有的任何字段,然后用表单上的任何值覆盖,然后调用实际的控制器操作。” - 这是真的。它将进入数据库以检索所有字段,而不仅仅是那些不在表单上的字段。我在下面的回答提供了更多细节。

标签: grails data-binding controller


【解决方案1】:

https://github.com/grails/grails-core/blob/96c530ab4400f28a4cc0001b2bacbbce1e360cc1/grails-plugin-controllers/src/main/groovy/grails/artefact/Controller.groovy#L345

总之……

// This is pseudocode but it addresses the broad strokes of what you are asking about...
MyDomain md
if(params.id) {
    md = MyDomain.get(params.id)
} else if (request.method == 'POST') {
    md = new MyDomain()
}

if(md) {
    def doBinding = true
    if(params.id) {
        if(!(request.method in ['PUT', 'POST', 'DELETE'])) {
            doBinding = false
        }
    }

    if(doBinding) {
        // params won't necessarily be used here
        // if the request has a body, it will be used
        bindData md, params
    }

    // subject md to dependency injection

    // if md is Validateable then call .validate() on it
}

callToTheOriginalAction(md)

【讨论】:

  • 谢谢!这就是我要寻找的信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-12
  • 2012-03-31
  • 1970-01-01
  • 2011-02-21
  • 2016-12-26
  • 2014-05-07
相关资源
最近更新 更多