Validation 检查hasErrors并验证后将错误返回到Grails中的gsp页面

Validation 检查hasErrors并验证后将错误返回到Grails中的gsp页面,validation,grails,gsp,Validation,Grails,Gsp,我正在构建这个与用户配置文件一起工作的web应用程序。用户编辑配置文件,如果输入错误的数据,配置文件将以红色显示无效字段并显示消息。非常简单的场景。但由于某些原因,它没有像我想象的那样工作。我可能在什么地方遗漏了什么。以下是我在控制器中的操作 正如您在下面的代码中所看到的,我创建了一个新的概要文件,使用include列表将参数绑定到它,以仅绑定概要文件接受的那些参数,然后在概要文件实例上调用hasrerrors。在调试模式下,当用户输入错误时,我可以看到myProfile有错误,但是当我返回到e

我正在构建这个与用户配置文件一起工作的web应用程序。用户编辑配置文件,如果输入错误的数据,配置文件将以红色显示无效字段并显示消息。非常简单的场景。但由于某些原因,它没有像我想象的那样工作。我可能在什么地方遗漏了什么。以下是我在控制器中的操作

正如您在下面的代码中所看到的,我创建了一个新的概要文件,使用include列表将参数绑定到它,以仅绑定概要文件接受的那些参数,然后在概要文件实例上调用hasrerrors。在调试模式下,当用户输入错误时,我可以看到myProfile有错误,但是当我返回到editProfile页面时,它不会显示哪个字段有错误。我的gsp表单有render error标签,并且每个字段都有error

def update (){

   def myProfile = new Profile()
   dataBind(params, myProfile, include:[.....])

   if (myProfile.hasErrors()){ 
      respond myUser.errors, view: 'editProfile'             
      return
   } 
   else{
      redirect(action:"viewProfile")
   }
} 
我的普惠制是这样的,我现在无法访问我的家庭电脑来发布确切的普惠制页面:

<g:hasErrors bean="${myUser}" field="name">
    <g:message error="${myUser.errors.getFieldErrors("name")}" />
</g:hasErrors>

将整个对象传递给gsp,而不是试图将错误传递回去。假设gsp页面中的bean是“myUser”,那么呈现语句应该是这样的:

render view: 'editProfile', model: [myUser: myProfile]

使用
respondbean.errors
时,将根据类名而不是变量名调用bean

在您的情况下,您需要以
profile
的方式访问gep中的bean,如下所示:

//variable in controller
def myProfile = new Profile()

//bean in views
<g:hasErrors bean="${profile}" field="name">
    <g:message error="${profile.errors.getFieldErrors("name")}" />
</g:hasErrors>

因为看起来您正在执行一个HTML请求(不是Ajax),所以我通常会使用myUser,而不是myUser.errors来响应。然后gsp可以做一个测试。当hasErrors为true时,我们何时使用respond,何时使用redirect?当hasErrors()为true时,我不知道该怎么办,我想停止流并在gsp页面中显示错误。我知道“返回”会停止流动。但是我应该使用respond还是redirect?同样,如果我在一个gsp页面中有两个域对象,并且都有错误,那么有没有办法在这两个页面上都显示错误?我相信respond不会访问两个域实例,如果我错了请更正我在上面对另一个答案做了一些评论,有什么建议或建议吗?当hasErrors()为true时,您呈现视图并传递带错误的bean,然后返回。是的,您可以有多个带错误的bean,只需使用
,这将检查任何有错误的bean。您可以在Grails文档中了解更多关于它的信息:这样我就可以向视图发送多个域对象。这是有道理的。我其实是在跟踪脚手架是怎么做的。我为我的域类生成了控制器和视图,并遵循了代码结构,这就是为什么我希望使用与scaffolding相同的方法来响应。
render (view:'editProfile', model:[myUser: myProfile])