0

我在一个使用 Grails 的项目中,

我使用 beanFields 插件,我将 bean:inputTemplate 更改为以下内容

   <bean:inputTemplate>
    <div class="prop ${hasErrors(bean:$beanName,field:'$fieldId','errors')}">${label}
      <span  class="value">${field}
      </span>
    </div>
  </bean:inputTemplate>

如您所见,我正在尝试使用 $beanName 作为 BeanName .. 这是因为 beanFields 将 beanName 和 fieldId 以及更多其他属性传递给 inputTemplate 标记..

但是,问题是我不能那样做......而且我真的很懒惰,不想花所有时间复制和粘贴相同的字段 div 并为此维护一个巨大的文件......

因此,如果有任何人可以在这种情况下提供帮助,我将非常感激。

我想在 $ { } 代码块中引用一个变量,因为在 PHP 中有 $$variable 使用 $variable 的值作为要评估的变量的名称。

希望我很清楚..并感谢您的帮助。

4

3 回答 3

0

不是直接回答您的问题,但您看过 bean-fields 插件吗?

http://grails.org/plugin/bean-fields

我认为它可以做你想做的事情,还有更多

于 2009-10-27T11:51:38.853 回答
0

您不需要在 beanName 前面加上 $,它应该在范围内。

<div class="prop ${hasErrors(bean:beanName,field:'username','errors')}" >

另外,我认为 beanFields 已经通过 errors 变量提供了错误消息。

所以你可以测试看看errors是否不为null,而不是调用hasErrors。

于 2009-10-27T22:55:14.613 回答
0

在调查了这个问题之后..我发现是的 beanName 被传递给了模板,我不需要在 beanName 前面使用 $ ......

但是,当我使用 hasErrors(beans:beanName,field:'username','errors') 时它仍然不起作用。

但是,我可以做到这一点

<bean:inputTemplate>
    <div class="prop">${label}
      <span  class="value">${field}
      </span>
      <g:if test="${errors}"><div class="errors"> ${errors} </div></g:if>
    </div>
  </bean:inputTemplate>

即使它不起作用,它也取决于域类上的 validate 方法,所以写这个

if ( ! (userSecurity.validate() && userProfile.validate() && address.validate() && photo.validate() ) ){
                    flash.message = ' Error registering user '
                    render(view:'index',model:[security:userSecurity,user:userProfile,address:address,photo:photo])
            }else{
                    UserSecurity.withTransaction { status ->
                            userProfile.photos*.save()
                            address?.save()
                            userProfile?.save()
                            userSecurity.password = userSecurity.password.encodeAsPassword()
                            userSecurity.confirmPassword = userSecurity.confirmPassword.encodeAsPassword()
                            userSecurity?.save()
                    }
                    flash.message = 'No Errors Registering User'
                    render(view:'index',model:[security:userSecurity,user:userProfile,address:address,photo:photo])
            }

因为, && 以第一个 False 结果失败,并且其他验证方法不会被执行。

所以把它们改成这个

if ( ! (userSecurity.validate() & userProfile.validate() & address.validate() & photo.validate() ) ){
                    flash.message = ' Error registering user '
                    render(view:'index',model:[security:userSecurity,user:userProfile,address:address,photo:photo])
            }else{            ...              }

每个 bean 都经过验证,并且所有字段错误都会正确呈现。

于 2009-10-28T11:28:40.387 回答