我正在我的控制器中进行一些表单验证(使用插件),如果验证通过/失败,则设置一个名为status =true/false
的布尔变量
此验证发生在update
操作中,请求来自edit.gsp
。
如果验证失败,我希望控件返回edit.gsp。我可以实现这一点,或者我必须单独创建update.gsp
并复制edit.gsp
的内容以在update.gsp页面上显示编辑的表单值和错误消息?我想避免将所有其他参数传递给后端并返回仅进行1个字段的清理检查。
它应该看起来像javascript类似但实际上后端验证重定向到错误的同一页面..
我该如何实现这一目标?
成功验证后,我正在重定向到manageTemplate.gsp
。
此致 提前致谢
答案 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
这不会在验证失败的字段上突出显示验证。为此,您可以使用自定义验证器方法,也可以(我从未这样做过)能够手动“告诉”域对象哪些字段验证失败以及原因。