我无法从命令对象中呈现错误。它做得很好,但我的.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>
如何让错误显示在视图中?
答案 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与显示的页面不一致。例如,当用户设置书签时,这会中断。