Grails 3:通过POST绑定多个命令对象。

问题描述 投票:0回答:1

我有一个控制器,它有一个方法,我想把多个命令对象也绑定起来。 当我通过GET调用该方法时,它工作得很好,两个对象都被绑定了,但问题是如果我通过POST调用该方法,只有第一个命令对象被绑定,而第二个对象完全被忽略。 问题是如果我通过POST调用该方法,只有第一个命令对象被绑定,而第二个对象完全被忽略。

简单的例子。

def register(MembershipCommand cmd1, RegisterCommand cmd2) {
        println(cmd1.email);
        println(cmd2.pass);
        respond([:]);
}

如果我调用 /register?email=test&pass=test 然后 cmd1cmd2 满堂红

如果我打电话 /register 有POST数据 {email:test,pass:test}, cmd1 被填充和 cmd2.passnull.

有没有办法让这个数据绑定使用POST工作? 我真的不能使用GET,因为涉及到文件上传,再加上表单相当大。

我知道另一种选择是把方法分成两个,每个对象一个,然后让我的表单分别提交给每个对象,但我想尽可能避免这样做。

有什么好办法吗?

post grails grails-controller command-objects
1个回答
0
投票

我已经创建了一个最小的工作项目来测试你的想法。它工作得很好。下面是一些代码。

RegisterCmd.groovy

class RegisterCmd {
    String email
}

编辑.gsp

<g:form resource="${this.player}" method="POST" action="customisedUpdate">
        <g:hiddenField name="version" value="${this.player?.version}" />
        <fieldset class="form">
            <f:field bean="player" property="name" />
            <f:field bean="player" property="game" />
            <f:field bean="player" property="region" />
            <label>Email</label><g:field type="text" name="email"/>
        </fieldset>
        <fieldset class="buttons">
            <input class="save" type="submit" value="${message(code: 'default.button.update.label', default: 'Update')}" />
        </fieldset>
    </g:form>

浏览器

    @Transactional
    def customisedUpdate(Player player, RegisterCmd registerCmd) {
        println "Calling save ${player.dump()}"
        println "RegisterCmd: ${registerCmd.dump()}"
        //end::save[]
        //tag::save-handleErrors[]
        if (player == null) {
            render status: HttpStatus.NOT_FOUND
            return
        }

        if (player.hasErrors()) {
            respond player.errors, view: 'create'
            return
        }
        //end::save-handleErrors[]

        player.save flush: true

        request.withFormat {
            form multipartForm { redirect player }
            '*' { respond player, status: HttpStatus.CREATED }
        }
        //tag::save[]
    }

输出的样子。

Calling save <com.itersdesktop.javatechs.grails.Player@1c25113d name=Alexis Barnett game=Pandemic region=EAST wins=96 losses=30 id=1 version=4 org_grails_datastore_mapping_dirty_checking_DirtyCheckable_
_$changedProperties=[name:HUE THI MY NGO] org_grails_datastore_gorm_GormValidateable__errors=org.grails.datastore.mapping.validation.ValidationErrors: 0 errors org_grails_datastore_gorm_GormValidateable
__skipValidate=false>
RegisterCmd: <com.itersdesktop.javatechs.grails.RegisterCmd@7ee6bb8c [email protected] grails_validation_Validateable__beforeValidateHelper=org.grails.datastore.gorm.support.BeforeValidateH
elper@3409999e grails_validation_Validateable__errors=grails.validation.ValidationErrors: 0 errors>

如果你对这个项目有兴趣,请到以下地址咨询: https:/bitbucket.orgitersdesktopcommand-objectssrcmaster。


0
投票

让POST工作的解决方案是将我的表单数据重组为对象样式的格式。

因此,我没有使用 {email:test,pass:test}

我本来 {cmd1:{email:test}, cmd2:{pass:test}}

© www.soinside.com 2019 - 2024. All rights reserved.