Grails表单错误处理:绑定1:1对象映射
问题描述:
我有一个注册表单,其中包含与两个域对象相关的字段;用户和配置文件。该关系是用户域类拥有的1:1映射。Grails表单错误处理:绑定1:1对象映射
用户控制器上的“注册”操作会封送表单值,并且如果没有验证错误,则会在提交表单时保留用户对象并将其重定向到应用程序根目录。否则,控制器将重新导向注册表单,显示预填充字段的值为失败。
但是,在实践中,当验证失败时,失败的值不会显示在视图中。下面是寄存器动作的代码:
def registration = {
}
def register = {
def user = new User()
bindData(user, params)
if (user.save()) {
flash.message = 'Successfully Registered User'
redirect(uri: '/')
}else {
flash.message = 'Registration Failed!'
redirect(action: registration, params: [ user: user ])
}
}
下面从图,示出用户和资料相关的字段的示例HTML摘录:
<div class="row">
<label for="city"> City, State: </label>
<g:textField id="city" name="profile.city"
value="${user?.profile?.city}" size="28" />
<span class="red">*</span>
</div>
<hr />
<div class="row">
<label for="email"> E-mail address: </label>
<g:textField id="email" name="userId" value="${user?.userId}" size="28" />
<span class="red">*</span>
</div>
在语法上,寄托都没问题;我正在使用适当的命名约定和grail的插值来处理值,所以我很好地结束了为什么这不符合预期。
任何意见或建议,将不胜感激。
感谢, -Tom
答
如果我没有记错我认为这是东西的线路:
def user = new User()
user.properties = params
答
您需要在register
行动某种方式传递来自user
提交值user
在registration
行动。像这样:
if (params.user) {
user.properties = params.user.properties
}
答
尝试明确调用erorr?
我一直使用这种模式重定向回到相同的形式。
if (user.save()) {
...
} else {
return error()
}
我通常使用在webflows命令对象,所以我的正常模式如下:
def registerFlow = {
registerPage = {
on("submit") { FormDataCommand cmd ->
cmd.validate()
if (cmd.hasErrors()) {
flow.cmd = cmd
return error()
} else {
...
}
}
}
}
class FormDataCommand implements Serializable {
User u
Profile p
static constraints = {
u(validator: { it.validate() })
p(validator: { it.validate() })
}
}
我添加以下逻辑来登记动作: – 2011-05-01 15:50:20
我本来由于用户必须指定user.properties两次已经在注册行动中进行编组。无论如何,我已将此添加到登记:'DEF登记= { \t \t如果(params.user){ \t \t \t DEF用户= params.user \t \t \t返回[用户:用户] \t \t} \t} '。但是,我现在为用户?.profile?。firstname获得了'No Such Property Found:profile'错误。 – 2011-05-01 15:59:28
是的,你会的。那么,我个人习惯于'render(view:'registration',model:[user:user])',而不是'redirect()' - 这将避免所有的参数传递。看起来'user'在'params'中变成了String,所以你必须使用'render()'。 – 2011-05-02 02:38:25