在重定向中呈现命令验证错误

时间:2011-08-16 14:35:40

标签: grails error-handling render grails-validation grails-constraints

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

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

2 个答案:

答案 0 :(得分:9)

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

    错误条件中的
  • render()而不是redirect()

    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])
    

    这个选项有点值得怀疑。如果操作不正确,您可能会污染会话并使对象闲置,占用内存。但是,如果正确完成,它可能是实现重定向后获取的一种不错的方式。

答案 1 :(得分:0)

使用Grails 3(我不知道这样做是否更早),可以使用the flash。根据文档,闪存将“在下一个请求结束时清除”。

我喜欢使用这样的模式:

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