【问题标题】:Rendering command validation errors across a redirect跨重定向呈现命令验证错误
【发布时间】:2011-10-28 03:20:36
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    您不能使用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])
      

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

    【讨论】:

    • 啊啊!您已经结束了 3 小时的漫游。非常感谢!
    • 谢谢,我发现您的回答也很有帮助。顺便说一句,我想直接使用 flash 而不是 session 会防止 session-pollution?
    • @tim_wonil 是的,闪存范围应该自行清理。我还没有看到它在幕后做了什么,但我猜它只是使用会话进行存储。这可能对这样的事情有好处。
    • 是的,使用闪存范围显示错误是另一个常见的习惯用法。不过,不一定是最好的成语。另请参阅grails.org/doc/latest/ref/Controllers/chain.html 以使用模型重定向。
    • 哈,我刚刚注意到chain 使用了闪存范围。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2010-12-30
      • 2013-09-16
      • 1970-01-01
      • 2015-07-13
      • 1970-01-01
      • 2013-03-24
      • 2016-04-02
      • 1970-01-01
      • 2011-09-22
      相关资源
      最近更新 更多