7

我无法从我的命令对象中呈现错误。它做得很好,但我的 .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>

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

4

2 回答 2

9

您不能使用params. 你有几个选择:

  • render()在错误情况下,而不是redirect()ing:

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

    这是你正在做的最常见的习语。

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

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

    这个选项有点可疑。如果没有正确完成,您可能会污染会话并让对象四处游荡,占用内存。但是,如果做得正确,它可能是实现后重定向获取的一种不错的方式。

于 2011-08-16T14:47:46.033 回答
0

使用 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 与显示的页面不一致。例如,当用户设置书签时,这会中断。

于 2019-05-17T14:20:01.403 回答