如何在Grails Web Flow中呈现验证结果?

时间:2010-09-21 04:26:45

标签: grails spring-webflow

我有一个类似于以下示例的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()时,是否会将流程发送回initfirst
  • error()是否接受任何可用于我正在尝试完成的任何参数(即模型)(我找不到关于error()方法的大量文档)。
  • 我还会就如何改善流量状态以更好地处理这些验证错误提出建议。

摘要:在Grails Web Flow中呈现验证错误的首选方法是什么?

2 个答案:

答案 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>