Grails复选框

Grails复选框,grails,Grails,我在关联类中绑定布尔属性时遇到问题。如果我选中复选框(good),则属性设置为true,如果未选中checbox,则属性设置为null 我知道HTML复选框的问题。我知道为什么在参数中发送“\u fieldName”,但是这个“\u fieldName”没有将我的布尔属性设置为false class Person{ String title List<Group> groups = new ArrayList() static hasMany = [groups:

我在关联类中绑定布尔属性时遇到问题。如果我选中复选框(good),则属性设置为true,如果未选中checbox,则属性设置为null

我知道HTML复选框的问题。我知道为什么在参数中发送“\u fieldName”,但是这个“\u fieldName”没有将我的布尔属性设置为false

class Person{
   String title

   List<Group> groups = new ArrayList()
   static hasMany = [groups: Groups]    
}

class Group{
   String title
   Boolean isHidden

   static belongTo = Person
}

class PersonController{

   def form = {
      def person = new Person()
      person.groups.add( new Group() )    
      return ["person": person]
   }

   def handleForm = {
      def person = new Person( params )
      println person.groups[0]
   }
}


 <g:form action="save">
    <g:textField name="title" value="${person?.title}" />
    <g:textField name="groups[0].title" value="${person?.groups[0]?.title}"/> 
    <g:checkBox name="groups[0].isHidden" value="${person?.groups[0]?.isHidden}"  />   
    <g:submitButton name="save" value="Save" />
  </g:form>
班级人员{
字符串标题
列表组=新的ArrayList()
静态hasMany=[组:组]
}
班级{
字符串标题
布尔伊希登
静态归属=人
}
类个人控制器{
定义格式={
def person=新人员()
person.groups.add(新组())
返回[“人”:人]
}
def handleForm={
def person=新人员(参数)
println个人组[0]
}
}
如果我选中复选框:
[isHidden:on,title:a,[u isHidden:][br/> println person.groups[0]//true

如果我不选中复选框:
[标题:a,_ishiden:][br/> println个人组[0]/null



非常感谢您的帮助
汤姆

很抱歉,我搜索了这个网站,但没有得到关于我的麻烦的实际信息。

经过多次黑客攻击,答案似乎是grails正在寻找一个名为:

groups[0]._isHidden
而不是

_groups[0].isHidden
这实际上是
g:checkBox
标记生成的内容。请参阅propertyStartsWithFieldMarkerPrefix(PropertyValue pv,String fieldMarkerPrefix)以获得确认


如果您感兴趣,我已将此问题的测试项目上载到

我更正复选框标记。多亏了gid的帮助,现在它也可以与协会合作了

来源:

if(value==null)value=false
out使用下面的代码

<g:checkBox name="checkbox" value="HELLO" />

参考:


  • 将复选框的默认值设置为“false”,它将解决该问题。
    希望能有帮助

    一些GSP代码在这里可能很有用。嗨,斯科特,我附加了GSP代码。谢谢Tom这个bug还没有在grails github repo上修补:这让我发疯了!!好东西。。我会看看是否可以为grails项目创建一个测试和补丁。多亏了这一点,我真不敢相信他们还没有解决这个问题。我不得不稍微调整一下源代码。但总体思路是可行的。您需要更新隐藏字段的名称。我建议在此处使用模板来呈现输入标记。这将提高可读性和可维护性。
    if (value == null) value = false
    
    def begin =  name.lastIndexOf('.') +1
    def tail =  name.substring( begin);
    out << "<input type=\"hidden\" name=\"${name.replace(  tail, "_" + tail  )}\" /><input type=\"checkbox\" name=\"${name}\" "
    
    if (value && checked) { out << 'checked="checked" ' } 
    
    <g:checkBox name="checkbox" value="HELLO" />