1

我有一个注册表单,其中包含与两个域对象相关的字段;用户和个人资料。该关系是 User 域类拥有的 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 的插值来访问值,所以我不知道为什么它的行为不符合预期。

任何意见或建议将不胜感激。

谢谢,-汤姆

4

3 回答 3

0

尝试显式调用错误?

我一直在使用这种模式来重定向回相同的表单。

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-02T02:18:41.893 回答
0

如果我没记错的话,我认为它是这样的:

def user = new User()
user.properties = params
于 2011-05-01T14:50:30.587 回答
0

您需要以某种方式将提交的值从user实际register传递到user实际registration。像这样:

if (params.user) {
  user.properties = params.user.properties
}
于 2011-05-01T15:16:08.413 回答