跨重定向呈现命令验证错误
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 与显示的页面不一致。例如,当用户设置书签时,这会中断。
【讨论】:
以上是关于跨重定向呈现命令验证错误的主要内容,如果未能解决你的问题,请参考以下文章