如果验证在grails中失败,则返回到同一页面

时间:2012-03-21 18:39:27

标签: grails redirect

我正在我的控制器中进行一些表单验证(使用插件),如果验证通过/失败,则设置一个名为status =true/false的布尔变量

此验证发生在update操作中,请求来自edit.gsp。 如果验证失败,我希望控件返回edit.gsp。我可以实现这一点,或者我必须单独创建update.gsp并复制edit.gsp的内容以在update.gsp页面上显示编辑的表单值和错误消息?我想避免将所有其他参数传递给后端并返回仅进行1个字段的清理检查。
它应该看起来像javascript类似但实际上后端验证重定向到错误的同一页面.. 我该如何实现这一目标? 成功验证后,我正在重定向到manageTemplate.gsp

此致 提前致谢

1 个答案:

答案 0 :(得分:3)

根据您使用插件触发验证的方式,我认为最简单的方法是在您的域对象上编写自定义验证器。更多信息:http://grails.org/doc/latest/ref/Constraints/validator.html

如果您不想(或不能)沿着该路线走,您可以手动检查控制器中插件的验证。它基本上与脚手架Grails页面/控制器使用的模式相同。

在您的控制器中,您可以使用插件进行验证,如果域实例未验证,则会将用户重定向回编辑操作并包含“参数”。这样,所有字段仍将按原样填充。

来自脚手架Grails控制器的更新片段(对于名为Tag的域对象):

    // ...
    // Code above here just gets the domain object to edit (tagInstance in this case)
    // and checks that the object hasn't be updated in the meantime

    tagInstance.properties = params

    // params have been applied to object, you can now do custom validation

    def status = extraValidationService.validate( tagInstance ) // or however you run the validation

    if ( !status ) {
       flash.message = "Did not pass custom validation"
       render(view: "edit", model: [tagInstance: tagInstance]) // Back to same edit page (field values maintained)
       return        
    }

    // Everything below here is unchanged

    if ( !tagInstance.save( flush: true, failOnError: false ) ) {
        render(view: "edit", model: [tagInstance: tagInstance])
        return
    }

    flash.message = message(code: 'default.updated.message', args: [message(code: 'tag.label', default: 'Tag'), tagInstance.id])
    redirect(action: "show", id: tagInstance.id) // This is where you redirect to the manageTemplate action.gsp

这不会在验证失败的字段上突出显示验证。为此,您可以使用自定义验证器方法,也可以(我从未这样做过)能够手动“告诉”域对象哪些字段验证失败以及原因。