Forms Grails重复表单提交和字段验证

Forms Grails重复表单提交和字段验证,forms,validation,grails,form-submit,Forms,Validation,Grails,Form Submit,在控制器中,我验证表单输入,如下所示: withForm { def user = new User(params) if(user.save()) { render "success" } else { render view: "userForm", model: [user: user] } }.invalidToken { render view: "userForm" } 在表格I中,如果输入字段出现错误

在控制器中,我验证表单输入,如下所示:

withForm {
    def user = new User(params)    
    if(user.save()) {
        render "success"
    } else {
        render view: "userForm", model: [user: user]
    }
}.invalidToken {
    render view: "userForm"
}
在表格I中,如果输入字段出现错误,则在该字段中添加类错误:

<input value="${user?.name}" name="name" type="text" class="text${user?.errors?.getFieldError("name") ? ' error':''}" id="name">

问题: 在视图中看不到Bean用户。如果我用Form wrap移除,它可以正常工作

有人知道会发生什么吗


谢谢。

例如,您的表单声明是否包含useToken

<g:form useToken="true" ...>

为了让视图显示验证错误,控制器操作需要创建一个用户实例并对其进行验证。您当前的
.invalidToken
块不能执行此操作。一个很容易做到这一点的好方法是让你的控制器动作从你的参数自动创建一个
User
实例:

def myAction(User user) {
    withForm { 
        if(user.save()) {
            render "success"
        } else {
            render view: "userForm", model: [user: user]
        }
    }.invalidToken {
        render view: "userForm", model: [user: user]
    }
}

是的,它使用useToken标记。是否希望在重复提交时返回用户bean?您仅在保存失败时返回用户。否,我希望在验证失败时返回它(在else子句中:呈现视图:“userForm”,model:[User:User])。如果我省略withForm闭包,它可以正常工作。控制器操作的其余部分是什么样子的,我假设这只是一个片段。由于render没有显式退出控制器操作,所以我唯一能想到的是withForm之后是否有其他可能会干扰的代码。在actual controller中,我使用return语句而不是renders,并让grails约定呈现适当的视图。感谢自动创建用户实例提示。然而,我不想在令牌无效时显示错误,而只是在令牌有效但验证失败时显示错误。我认为我的上层代码可以用于此目的。
def myAction(User user) {
    withForm { 
        if(user.save()) {
            render "success"
        } else {
            render view: "userForm", model: [user: user]
        }
    }.invalidToken {
        render view: "userForm", model: [user: user]
    }
}