代码之家  ›  专栏  ›  技术社区  ›  Rob Hruska MegalomanINA

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

  •  1
  • Rob Hruska MegalomanINA  · 技术社区  · 14 年前

    我有一个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 或者去 ?
    • 错误() 错误()
    • 我还建议如何改进流状态,以便更好地处理这些验证错误。

    总结:

    2 回复  |  直到 12 年前
        1
  •  3
  •   ken    14 年前

    -1个

    具有无效域对象的模型 所以我可以用。。。在我的 视图(就像在正常情况下一样 控制器动作)?

    您只需要返回有错误的域对象。你可以在一个

    action {
      user.validate()
      return [user:user]
    }
    

    您也可以在flash scope中设置错误。在每个转换中,Grails都会将flash范围的内容复制到ModelView中,从而在gsp页面中可用

    action {
       flash.error = "your message"
    }
    

    -2个

    当我调用error()时,它是否将流发送回init或 第一?当您调用error时,它调用 为定义的转换

    on("error").to("handlerError")
    

    error()是否接受可用于 查找有关错误() 方法)。

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

    3个-

    我也会考虑如何改进我的流状态 更好地帮助处理这些

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

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

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

        2
  •  0
  •   Rob Hruska MegalomanINA    14 年前

    我发现一种方法就是 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>