gpt4 book ai didi

Grails 3.3.1 带有域对象参数的 Controller 操作 - 数据如何绑定(bind)?

转载 作者:行者123 更新时间:2023-12-02 13:50:25 26 4
gpt4 key购买 nike

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

我想了解,在将 Domain 类作为参数提供给 Controller 操作时,正在调用哪些方法。考虑默认 更新 行动:

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] }
}
}

导致上述 Controller 操作范围的事件顺序是什么?我最好的猜测如下,但我想确认一下。
def someActionWrapper() {
MyDomain instance = MyDomain.get(params.id)
instance.properties = params
update(instance)
}

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

编辑

被问到这个问题时库的当前版本:
  • Grails 3.3.1
  • Groovy 2.4.12
  • 最佳答案

    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)

    关于Grails 3.3.1 带有域对象参数的 Controller 操作 - 数据如何绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46532091/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com