【问题标题】:Returning errors to gsp page in Grails after checking for hasErrors and Validating检查 hasErrors 和验证后将错误返回到 Grails 中的 gsp 页面
【发布时间】:2014-01-28 05:01:38
【问题描述】:

我正在构建这个适用于用户个人资料的网络应用。用户编辑配置文件,如果输入错误数据,配置文件会以红色显示无效字段并显示消息。很简单的场景。但由于某些原因,它不像我想象的那样工作。我可能在某个地方遗漏了一些东西。这是我在控制器中所做的。

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

def update (){

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

   if (myProfile.hasErrors()){ 
      respond myUser.errors, view: 'editProfile'             
      return
   } 
   else{
      redirect(action:"viewProfile")
   }
} 

我的 gsp 是这样的,我现在无法访问我的家用电脑来发布确切的 gsp 页面:

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

【问题讨论】:

  • 因为看起来您正在执行 HTML 请求(不是 Ajax),所以我通常会使用 myUser 进行响应,而不是 myUser.errors。然后 gsp 可以做一个 .
  • 什么时候使用响应,什么时候使用重定向,当 hasErrors 为真时?我不明白当 hasErrors() 为真时该怎么做,我想停止流程并在 gsp 页面中显示错误。我知道“返回”会停止流动。但我应该使用响应还是重定向?
  • 另外,如果我在一个 gsp 页面中有两个域对象并且都有错误,有没有办法在它们上显示错误?我相信响应不会访问两个域实例,如果我错了,请纠正我

标签: validation grails gsp


【解决方案1】:

当你使用respond bean.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>

如果您需要使用特定名称(如 myUser)调用您的 bean,只需将其传递到模型中即可:

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

【讨论】:

    【解决方案2】:

    不要尝试将错误传递回去,而是将整个对象传递给您的 gsp。假设您在 gsp 页面中拥有的 bean 是“myUser”,那么渲染语句应该是这样的:

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

    【讨论】:

    • 我在上面的其他答案上做了一些 cmets,有什么建议或建议吗?
    • 当 hasErrors() 为真时,渲染视图并传递带有错误的 bean,然后返回。
    • 是的,你可以有多个有错误的bean,只需使用&lt;g:hasErrors&gt;,这将检查任何有错误的bean。您可以在 Grails 文档中了解更多信息:grails.org/doc/latest/ref/Tags/hasErrors.html
    • 这样我就可以将多个域对象发送到视图。这就说得通了。我实际上是在关注脚手架是如何做到的。我为我的域类生成了控制器和视图,并遵循了代码结构,这就是为什么我想像脚手架一样使用响应。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-02
    相关资源
    最近更新 更多