【问题标题】:Grails checkboxGrails 复选框
【发布时间】:2014-12-10 14:47:24
【问题描述】:

我无法在关联类中绑定布尔属性。如果我选中复选框(好),属性设置为 true,但如果未选中复选框,则属性设置为 null

我知道 HTML 复选框的问题。我知道为什么在参数中发送“_fieldName”,但是这个“_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>

如果我选中复选框:
[isHidden:on, 标题:a, _isHidden:]
println person.groups[0] //true

如果我不选中复选框:
[标题:a,_isHidden:]
println person.groups[0] //null



非常感谢您的帮助
汤姆
很抱歉,我搜索了这个网站,但没有得到真正的信息来解决我的问题。

【问题讨论】:

标签: grails


【解决方案1】:

经过多次修改后,答案似乎是 grails 正在寻找一个具有以下名称的标记字段:

groups[0]._isHidden

而不是

_groups[0].isHidden

这实际上是g:checkBox 标签生成的。见GrailsDataBinder.java:911 见propertyStartsWithFieldMarkerPrefix(PropertyValue pv, String fieldMarkerPrefix) 确认

如果你有兴趣,我已经把这个问题的测试项目上传到gitub.com

【讨论】:

    【解决方案2】:

    我更正了复选框标签。感谢 gid 的帮助,现在它也可以与关联一起使用。

    来源:
    http://grails.org/doc/latest/ref/Tags/checkBox.html#

     if (value == null) value = false
    
    out << "<input type=\"hidden\" name=\"_${name}\" /><input type=\"checkbox\" name=\"${name}\" "
    
    if (value && checked) { out << 'checked="checked" ' } 
    

    到:

    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" ' } 
    

    【讨论】:

    • 好东西.. 我会看看我是否可以为 grails 项目创建一个测试和补丁
    • 感谢这有很大帮助,我不敢相信他们还没有解决这个问题。我不得不稍微调整一下来源。但总体思路是有效的。您需要更新隐藏字段的名称。
    • 我建议在这里使用模板来呈现输入标签。这将提高您的可读性和可维护性。
    【解决方案3】:

    使用下面的代码,

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

    参考:

    1. http://grails.asia/grails-checkbox-tag-example/
    2. http://grails.org/doc/latest/ref/Tags/checkBox.html

    【讨论】:

      【解决方案4】:

      将复选框的默认值设置为“false”,应该可以解决问题。 希望能帮助到你。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-06
        • 2014-05-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多