跨重定向呈现命令验证错误

Posted

技术标签:

【中文标题】跨重定向呈现命令验证错误【英文标题】: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>

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

【问题讨论】:

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

【讨论】:

以上是关于跨重定向呈现命令验证错误的主要内容,如果未能解决你的问题,请参考以下文章

Flask 消息闪烁跨重定向失败

Spring 跨重定向请求传递数据

Spring之跨重定向请求传递数据

Spring 梳理-跨重定向请求传递数据-Flash

linux呈现数据

反应路由器身份验证重定向