我创建了一个最小的工作项目来测试你的想法。它就像一个魅力。以下是片段。
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>
PlayerController.groovy
@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=alexis.barnett@gmail.com grails_validation_Validateable__beforeValidateHelper=org.grails.datastore.gorm.support.BeforeValidateH
elper@3409999e grails_validation_Validateable__errors=grails.validation.ValidationErrors: 0 errors>
如果您对该项目感兴趣,请在https://bitbucket.org/itersdesktop/command-objects/src/master/查阅