在调查了这个问题之后..我发现是的 beanName 被传递给了模板,我不需要在 beanName 前面使用 $ ......
但是,当我使用 hasErrors(beans:beanName,field:'username','errors') 时它仍然不起作用。
但是,我可以做到这一点
<bean:inputTemplate>
<div class="prop">${label}
<span class="value">${field}
</span>
<g:if test="${errors}"><div class="errors"> ${errors} </div></g:if>
</div>
</bean:inputTemplate>
即使它不起作用,它也取决于域类上的 validate 方法,所以写这个
if ( ! (userSecurity.validate() && userProfile.validate() && address.validate() && photo.validate() ) ){
flash.message = ' Error registering user '
render(view:'index',model:[security:userSecurity,user:userProfile,address:address,photo:photo])
}else{
UserSecurity.withTransaction { status ->
userProfile.photos*.save()
address?.save()
userProfile?.save()
userSecurity.password = userSecurity.password.encodeAsPassword()
userSecurity.confirmPassword = userSecurity.confirmPassword.encodeAsPassword()
userSecurity?.save()
}
flash.message = 'No Errors Registering User'
render(view:'index',model:[security:userSecurity,user:userProfile,address:address,photo:photo])
}
因为, && 以第一个 False 结果失败,并且其他验证方法不会被执行。
所以把它们改成这个
if ( ! (userSecurity.validate() & userProfile.validate() & address.validate() & photo.validate() ) ){
flash.message = ' Error registering user '
render(view:'index',model:[security:userSecurity,user:userProfile,address:address,photo:photo])
}else{ ... }
每个 bean 都经过验证,并且所有字段错误都会正确呈现。