我有一个类似于以下示例的Grails WebFlow:
def myFlow = {
init {
action {
def domain = MyDomain.get(params.id)
flow.domain = domain ? domain : new MyDomain()
}
on('success').to 'first'
}
first {
on('continue') {
flow.domain.properties = params
if(!flow.domain.validate()) {
return error()
}
}.to 'second'
}
...
}
鉴于此示例,如果on('continue')
中的转换first
中发生验证错误:
<g:hasErrors>...
(就像在普通控制器操作中一样)?error()
时,是否会将流程发送回init
或first
?error()
是否接受任何可用于我正在尝试完成的任何参数(即模型)(我找不到关于error()
方法的大量文档)。摘要:在Grails Web Flow中呈现验证错误的首选方法是什么?
答案 0 :(得分:3)
-1
什么是设置的首选方式 具有无效域对象的模型 所以我可以在...中使用... 观点(就像我在正常情况下一样 控制器动作)?
您只需要返回包含错误的域对象。你可以做到这一点 行动状态
action {
user.validate()
return [user:user]
}
您还可以在闪存范围内设置错误。在每次转换时,Grails会将flash范围的内容复制到ModelView中,因此可以在gsp页面中使用
action {
flash.error = "your message"
}
-2
当我调用error()时,它是否将流发送回init或者 第一?当你拨打错误时,它会拨打电话 您为
定义的转换
您应该为
等定义处理程序on("error").to("handlerError")
error()是否接受可用于的任何参数(即模型) 我想要完成的事情(我做不到 找到关于错误的很多文档() 方法)。
我不这么认为,但是当你从一个状态转换到另一个状态时,你可以做以下任何变量
on("error") {
// do Something
}.to("handlerError")
3 -
我还会就如何改善流动状态提出建议 更好地处理这些 验证错误。
我使用flash进行全局和表单错误,但我需要一种方法来处理它。目前使用Grails,流程中的闪存范围管理方式与正常操作中管理的方式不同。所以我决定编写一个小插件来改变流程中处理flash作用域的方式,并使其与正常操作中管理的方式保持一致。 我是一个gsp页面,无论动作类型(正常或流程)如何,我都能以下面的方式使用我的标签
<message:global />
or
<message:inline />
至于表单字段错误,我不喜欢处理域对象中的错误。我想要更统一的东西。所以我决定让它们成为http协议的一部分,我有一个javascript组件,如果我选择将它们注入到表单中。我发现这个解决方案比每次处理g:错误更清晰。
-Ken
答案 1 :(得分:0)
我发现一种方法是在过渡状态下专门调用render()
,提供模型。这是一个只验证一个字段的例子:
first {
render(view: 'info', model: [flow.domain])
on('continue') {
if(!flow.domain.validate(['myField'])) {
return error()
}
}.to 'second'
}
然后可以使用<g:hasErrors>
,如下所示:
<g:hasErrors bean="${domain}" field="myField">
<g:renderErrors bean="${domain}" as="list" field="myField"/>
</g:hasErrors>