通过重定向呈现命令验证错误

发布于 2024-11-29 14:02:14 字数 628 浏览 1 评论 0原文

我无法从我的命令对象中呈现错误。它做得很好,但我的 .gsp 视图没有呈现我提出的错误。

这是我的控制器操作:

def handleModifyProfile2 = { CreditProviderModificationCommand cpmc -> // bind params to the command object
   if (cpmc.hasErrors()) {
      flash.message = "Error modifying your profile:"
      redirect(action: "modifyProfile", params: [creditProvider : cpmc])
   } ...

这是我尝试在 .gsp 视图中呈现错误的方法:

<g:hasErrors bean="${creditProvider}">
   <div class="errors">
       <g:renderErrors bean="${creditProvider}" as="list" />
   </div>
</g:hasErrors>

如何让错误显示在视图中?

I cannot render the errors from my command object. It does the job well but my .gsp view does not render the errors I raise.

Here is my controller action:

def handleModifyProfile2 = { CreditProviderModificationCommand cpmc -> // bind params to the command object
   if (cpmc.hasErrors()) {
      flash.message = "Error modifying your profile:"
      redirect(action: "modifyProfile", params: [creditProvider : cpmc])
   } ...

Here is how I try to render the errors in my .gsp view:

<g:hasErrors bean="${creditProvider}">
   <div class="errors">
       <g:renderErrors bean="${creditProvider}" as="list" />
   </div>
</g:hasErrors>

How can I get the errors to be displayed in the view?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

初心 2024-12-06 14:02:14

您无法使用 params 在重定向中发送命令。您有几个选择:

  • 在错误条件下使用

    render() 而不是 redirect()ing:

    if(cpmc.hasErrors()) {
        渲染(视图:'个人资料',模型:[creditProvider:cpmc])
    }
    

    这是您正在执行的操作中最常见的习惯用法。

  • 将命令存储在会话中以在重定向中保留它:

    if(cpmc.hasErrors()) {
        会话.cpmc = cpmc
        重定向(...)
    }
    
    // 在你的行动中
    def cpmc = session.cpmc ?: null
    渲染(视图:'个人资料',模型:[creditProvider:cpmc])
    

    这个选项有点值得商榷。如果操作不正确,您可能会污染会话并让对象闲置,从而占用内存。不过,如果操作正确,这可能是实现重定向后获取的一种不错的方法。

You can't send the command across in a redirect using params. You have a couple options:

  • render() in the error condition instead of redirect()ing:

    if(cpmc.hasErrors()) {
        render(view: 'profile', model: [creditProvider: cpmc])
    }
    

    This is the most common idiom for what you're doing.

  • Store the command in the session to persist it across the redirect:

    if(cpmc.hasErrors()) {
        session.cpmc = cpmc
        redirect(...)
    }
    
    // and in your action
    def cpmc = session.cpmc ?: null
    render(view: 'profile', model: [creditProvider: cpmc])
    

    This option is somewhat questionable. If not done correctly, you can pollute the session and leave objects hanging around, taking up memory. If done correctly, though, it can be a decent way to implement a post-redirect-get.

怪异←思 2024-12-06 14:02:14

对于 Grails 3(我不知道这是否之前有效),可以使用 为此使用闪光灯。根据文档,闪存将“在下一个请求结束时被清除”。

我喜欢使用这样的模式:

def save(MyDomain myDomain) {
    if (myDomain.validate()) {
        myDomain.save()
    } else {
        flash.errors = myDomain.errors
    }
    redirect(action: 'edit', id: myDomain.id)
}

def edit(MyDomain myDomain) {
    if (flash.errors) {
        myDomain.errors = (Errors) flash.errors
    }
    return [myDomain: myDomain]
}

我不喜欢使用 render() 来进行这种错误处理,因为它会使浏览器中显示的 URL 与显示的页面不一致。例如,当用户设置书签时,这种情况就会中断。

With Grails 3 (I don't know if this worked earlier) it's possible to use the flash for this. According to the documentation, the flash will be "cleared at the end of the next request".

I like to use a pattern like this:

def save(MyDomain myDomain) {
    if (myDomain.validate()) {
        myDomain.save()
    } else {
        flash.errors = myDomain.errors
    }
    redirect(action: 'edit', id: myDomain.id)
}

def edit(MyDomain myDomain) {
    if (flash.errors) {
        myDomain.errors = (Errors) flash.errors
    }
    return [myDomain: myDomain]
}

I don't like to use render() for this kind of error handling, because it makes URLs shown in the browser inconsistent with the shown page. This breaks when users set bookmarks, for example.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文