1

我有一个类似于以下示例的 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>...在我的视图中使用 a 的首选方法是什么(就像我在正常的控制器操作中一样)?
  • 当我打电话error()时,它会将流量发送回init还是发送到first
  • 是否error()接受任何可用于我想要完成的参数(即模型)(我找不到关于该error()方法的太多文档)。
  • 我还会就如何改善我的流程状态以更好地处理这些验证错误提出建议。

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

4

2 回答 2

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() 是否接受任何可用于我想要完成的参数(即模型)(我找不到关于 error() 方法的太多文档)。

我不这么认为,但是当从一种状态转换到另一种状态时,您可以执行以下操作来设置任何变量

on("error") {
  // do Something
}.to("handlerError")

3-

我还会就如何改善我的流程状态以更好地处理这些验证错误提出建议。

我使用 flash 来处理全局错误和表单错误,但我需要一种方法来处理它。目前在 Grails 中,flash 范围在流中的管理方式与在正常操作中的管理方式不同。所以我决定写一个小插件来改变 flash 作用域在流中的处理方式,使其与正常操作中的管理方式保持一致。我是一个 gsp 页面,无论操作类型如何(正常或流程),我都可以按以下方式使用我的标签

    <message:global />
or 
    <message:inline />

至于表单字段错误,我不喜欢处理域对象中的错误。我想要更统一的东西。所以我决定让它们成为 http 协议的一部分,如果我愿意的话,我有一个 javascript 组件可以将它们注入到表单中。我发现这个解决方案比每次处理 g:errors 都要干净得多。

-ken

于 2010-09-21T22:31:45.273 回答
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>
于 2010-09-21T11:48:35.057 回答